相关疑难解决方法(0)

在C++ 14中,C++标准是否在使用不确定值和未定义行为方面发生了变化?

正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:

int x = 12;
{ int x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.

在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:

unsigned char x = 12;
{ unsigned char x = x; }
Run Code Online (Sandbox Code Playgroud)

这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]

C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?

c++ undefined-behavior language-lawyer c++11 c++14

62
推荐指数
1
解决办法
3991
查看次数

初始化是否需要左值到右值的转换?是`int x = x;`UB?

C++标准包含一个半着名的例子,在3.3.2中的"令人惊讶的"名称查找,"声明点":

int x = x;
Run Code Online (Sandbox Code Playgroud)

这初始化x自身,(原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量).

这实际上是未定义的行为吗?

根据4.1"左值到右值转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手是否x接受这种转换?如果是这样,示例实际上会有未定义的行为吗?

c++ initialization undefined-behavior language-lawyer

55
推荐指数
2
解决办法
2411
查看次数

这种自我指派是否做了明智的事情?

我刚刚在一个函数中找到了这行代码,这让我很困惑.这在任何情况下都有意义,还是未定义的行为?

char * acFilename = acFilename;
Run Code Online (Sandbox Code Playgroud)

编辑:编译器抱怨警告C4700,我正在使用未初始化的变量.

c c++

20
推荐指数
3
解决办法
4070
查看次数

为什么const类可以自己初始化?

今天我被一个非常愚蠢但很难被发现的bug所击中.这是相关代码:

class Vector;
class PointIterator {
  const Vector & x;
  const Vector & yv;

  PointIterator(const Vector & xv, const Vector & yvo) : 
    x(xv), yv(yv) { ;};
  //          ^^ here is wrong
};
Run Code Online (Sandbox Code Playgroud)

为什么这样的代码合法C++?有没有可以使用yv变量的情况?我知道类似的问题int x = x+1;,(参见这个问题),但后者没有正确初始化,你仍然可以使用x变量,而在上面的代码中,我认为你不能使用yv.

加分点:是否有任何编译选项可以让我发现这个?(最好使用gcc,但我也使用clang),除了"未使用的参数"警告(我有很多这些,我知道我应该清理它们).

c++

4
推荐指数
1
解决办法
195
查看次数

为什么将 std::string 初始化为 "" (通过 lambda)会崩溃?

为什么初始化std::stringto ""(通过 lambda)会崩溃?

这不会崩溃:

static std::string strTest2 = 
   [](){std::string * s = &strTest2; (*s) = "a"; return s->c_str();}();`
Run Code Online (Sandbox Code Playgroud)

这个技巧(首先将其初始化为非空,但预期的最终值为空)不会崩溃:

static std::string strTest3 =
   [](){std::string * s = &strTest3; (*s) = "b"; (*s) = ""; return s->c_str();}();
Run Code Online (Sandbox Code Playgroud)

在这里崩溃了(*s) = ""。是因为它是空字符串吗?很特别吗?std::string分配给 时是否未构造/初始化""

static std::string strTest1 =
   [](){std::string * s = &strTest1; (*s) = ""; return s->c_str();}();`
Run Code Online (Sandbox Code Playgroud)

c++ lambda initialization c++20 selfinitialization

1
推荐指数
1
解决办法
63
查看次数