【发布时间】:2019-06-17 11:49:59
【问题描述】:
这个代码是 UB 吗?
struct A
{
void nonconst() {}
};
const A& a = A{};
const_cast<A&>(a).nonconst();
换句话说,(临时)对象最初是const吗?我浏览了标准,但找不到答案,因此希望能引用相关部分的内容。
编辑:对于那些说A{} 不是const 的人,那么你能做到A{}.nonconst() 吗?
【问题讨论】:
-
A{}创建的临时本身不是 const。您只是在创建一个对它的 const 引用,然后您将丢弃该 const-ness 然后访问临时。这不会改变临时本身的 const-ness。如果您确定被指向/引用的对象实际上不是 const,那么从指针/引用中抛弃 const 不是 UB。如果对象实际上是 const,它会是 UB,例如const A a; const A &ref = a; const_cast<A&>(ref).nonconst(); -
您甚至可以将其绑定到
A&&。 -
我不认为它真的被称为临时的,因为在这种情况下 const 引用会延长生命周期。
-
回复您的编辑,yes
-
@RemyLebeau
A{}创建的临时对象本身不是 const。 在 C++17 中,A{}甚至不创建临时对象。跨度>
标签: c++ constants language-lawyer undefined-behavior temporary-objects