abr*_*ert 2 c++ rvalue-reference move-semantics c++14
有人可以帮助我理解为什么以下代码会导致警告
struct A
{
A() : _a( 0 ) {}
const int& _a;
};
int main()
{
A a;
}
Run Code Online (Sandbox Code Playgroud)
有警告
warning: binding reference member '_a' to a temporary value [-Wdangling-field]
A() : _a( 0 ) {}
Run Code Online (Sandbox Code Playgroud)
但是这段代码std::move用于初始化成员_a,不会:
struct A
{
A() : _a( std::move(0) ) {}
const int& _a;
};
int main()
{
A a;
}
Run Code Online (Sandbox Code Playgroud)
是不是0和std::move( 0 )两个r值?
这是一个表达式:
0
Run Code Online (Sandbox Code Playgroud)
这是一个非常小的表达,是的.但这是一种表达方式.
一旦表达式被评估,它就会消失.它消失了.加入合唱团隐形.去见它的制造商.它成为一个前表达.
确实,将const引用绑定到临时值会将临时值的范围扩展到封闭范围的末尾.
但在这种情况下,表达式的范围是构造函数.构造函数完成后,临时值将被销毁.
您的编译器注意到这样一个事实,即const对表达式的引用仍然作为类成员继续存在.您的编译器建议您使用类成员现在将导致未定义的行为.你的编译器想成为你的朋友.您的编译器不希望您编写错误代码,因此您可以从编译器获得一些免费,友好的建议.
在另一种情况下,您添加了一些稍微复杂的附加代码.它仍然是未定义的行为,但代码现在足够复杂,编译器无法看到未定义的行为结果.但它仍然是同一个错误.
当编译器看到它们时,编译器将尝试警告您潜在的问题.不幸的是,编译器每次都找不到所有可能的潜在问题.但是,很明显,编译器会让你知道.