【发布时间】:2017-04-02 08:58:33
【问题描述】:
谁能帮我理解为什么下面的代码会导致警告
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;
}
0 和 std::move( 0 ) 不都是 r 值吗?
【问题讨论】:
-
这里的_a指的是哪里?
-
_a是一个引用,在 ex1 中你将它绑定到一个临时的 (0),稍后使用它是 UB。在 ex2 中,您使用std::move作为对编译器“撒谎”的强制转换,它使警告静音,但稍后访问它仍然是 UB。 -
const &在类中使用时不会延长生命周期。它仅适用于函数参数和函数返回。 -
@NathanOliver 我认为您将其与其他内容混为一谈。
foo(bar{});不会改变bar跨越完整表达式的生命周期,另一方面bar const &b = bar{};确实延长了bar的生命周期,而没有看到函数。 -
@Quentin 是的,还有其他几个案例。我的主要观点是,您不能通过
const &将临时值传递给类并让类延长生命周期。
标签: c++ c++14 move-semantics rvalue-reference