gpt4 book ai didi

c++ - 右值在不使用 std::move 的情况下导致警告

转载 作者:太空狗 更新时间:2023-10-29 23:49:30 26 4
gpt4 key购买 nike

谁能帮我理解为什么下面的代码会引起警告

struct A
{
A() : _a( 0 ) {}

const int& _a;
};


int main()
{
A a;
}

警告

warning: binding reference member '_a' to a temporary value [-Wdangling-field]
A() : _a( 0 ) {}

但是这段代码,其中 std::move 用于初始化成员 _a,不会:

struct A
{
A() : _a( std::move(0) ) {}

const int& _a;
};


int main()
{
A a;
}

0std::move( 0 ) 不是右值吗?

最佳答案

这是一个表达式:

0

这是一个非常小的表达式,是的。但它是一个表达式。

一旦表达式被求值,它就会消失。它消失了。加入无形的合唱团。去见它的制造者。它变成了一个 ex 表达式。

确实,将 const 引用绑定(bind)到临时值会扩展临时值的范围,直到封闭范围结束。

但在这种情况下,表达式的范围是构造函数。构造函数完成后,临时值将被销毁。

您的编译器注意到一个事实,即对表达式的 const 引用仍然作为类成员继续存在。您的编译器建议您使用类成员现在将导致未定义的行为。你的编译器想成为你的 friend 。您的编译器不希望您编写有缺陷的代码,因此您将从编译器那里获得一些免费、友好的建议。

在另一种情况下,您添加了一些稍微复杂一些的额外代码。它仍然是未定义的行为,但代码现在已经足够复杂,编译器无法看到未定义的行为结果。但它仍然是同一个错误。

当编译器发现潜在问题时,编译器会尝试警告您。不幸的是,编译器无法每次都找到所有可能的潜在问题。但是,当它很明显时,编译器会让您知道。

关于c++ - 右值在不使用 std::move 的情况下导致警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40678256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com