正如初始化所述,需要进行左值到右值的转换?是int x = x;UB吗?C++标准在3.3.2 声明部分中有一个令人惊讶的例子,其中a int用它自己的不确定值初始化:
Run Code Online (Sandbox Code Playgroud)int x = 12; { int x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
Johannes对此问题的回答表明是未定义的行为,因为它需要左值到右值的转换.
在最新的C++ 14草案标准中N3936,可以在此处找到此示例已更改为:
Run Code Online (Sandbox Code Playgroud)unsigned char x = 12; { unsigned char x = x; }这里第二个x用它自己的(不确定的)值初始化.- 结束例子 ]
C++ 14中有关于不确定值和未定义行为的变化,这些变化在示例中引发了这种变化吗?
C++标准包含一个半着名的例子,在3.3.2中的"令人惊讶的"名称查找,"声明点":
int x = x;
Run Code Online (Sandbox Code Playgroud)
这初始化x自身,(原始类型)未初始化,因此具有不确定的值(假设它是一个自动变量).
这实际上是未定义的行为吗?
根据4.1"左值到右值转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手是否x接受这种转换?如果是这样,示例实际上会有未定义的行为吗?
我刚刚在一个函数中找到了这行代码,这让我很困惑.这在任何情况下都有意义,还是未定义的行为?
char * acFilename = acFilename;
Run Code Online (Sandbox Code Playgroud)
编辑:编译器抱怨警告C4700,我正在使用未初始化的变量.
我对以下代码感到困惑:
#include <iostream>
int i = 1;
int main()
{
int i = i;
std::cout << "i: " << i << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
i: 0
Run Code Online (Sandbox Code Playgroud)
我曾预计运行上面的代码会打印出来1.有人可以解释这种奇怪行为的原因吗?
所以有点C++代码:
void func( const std::string& theString )
{
std::string theString( theString );
theString += " more string";
std::cout << theString;
}
Run Code Online (Sandbox Code Playgroud)
用GCC 4.8和编译好VS 2013.根据我的C++知识,代码是可以的,一个局部变量theString被带入范围,然后隐藏theString在函数参数中.在theString构造点,唯一theString的范围是传递给std::string构造函数的函数参数.std::string然后命名构造theString,它进入范围并theString在代码中稍后使用.唷!
但是,GCC似乎theString传递给std::string构造函数的行为是本地theString(尚未构造)导致编译的程序崩溃.使用VS 2013,代码编译并运行良好.
所以,
以下代码是否有效C++,根据标准(折扣... s)?
bool f(T& r)
{
if(...)
{
r = ...;
return true;
}
return false;
}
T x = (f(x) ? x : T());
Run Code Online (Sandbox Code Playgroud)
众所周知,在这个项目使用的GCC版本中编译(4.1.2和3.2.3 ...甚至没有让我开始...),但应该吗?
编辑:我添加了一些细节,例如f()概念在原始代码中的样子.基本上,它意味着在某些条件下初始化x.
今天我被一个非常愚蠢但很难被发现的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++ 中的 lambda 表达式,我尝试了一些方法来查看结果。我实际上在 CppCon Back to Basics: Lambdas from Scratch - Arthur O'Dwyer - CppCon 2019 @21:47 中观看了视频并开始使用 lambdas。
举个例子,我试过这个:
#include <iostream>
using namespace std;
int g = 10;//global var 'g'
//creating lambda
auto kitten = [=] () {return g+1;};
auto cat = [g=g] () {return g+1;};
// main
int main()
{
g = 20;//modifying global variable 'g'
cout<<"kitten: "<<kitten()<<"cat: "<<cat()<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是:
kitten: 21cat: 11
Run Code Online (Sandbox Code Playgroud)
在上面的例子中:[g=g]表示捕获一个名称g和类型与外部相同的数据成员g,就像我写的一样auto g=g。这是一个副本 …
我有以下代码:
// in global scope:
int x = x;
Run Code Online (Sandbox Code Playgroud)
此代码编译时不会对 GCC 和 clang发出警告:
x:
.zero 4
Run Code Online (Sandbox Code Playgroud)
这是明确定义的吗?它是如何工作的?
下面的代码在Linux(g ++ 4.8.4)和Windows(VS Express 2013)上编译,但在执行时会产生不同的结果.
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char* argv[])
{
string str = str;
cout << "'str.length()': "
<< str.length() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在Linux上我得到:
'str.length()': 140187593065792
Run Code Online (Sandbox Code Playgroud)
在Windows上,我得到:
'str.length()': 0
Run Code Online (Sandbox Code Playgroud)
另外,如果我更改了如下所示的初始化语句,那么它符合但它在运行时崩溃(在Linux上我得到:在抛出'std :: bad_alloc'的实例后调用terminate):
string str = str + str;
Run Code Online (Sandbox Code Playgroud)
我理解,在这两种情况下,这不是初始化字符串变量的常用方法.但是,有人可以解释这段代码的真正错误吗?另外,为什么第一种情况下输出不同?