临时对象原来是const吗?

Pow*_*ice 11 c++ const undefined-behavior language-lawyer temporary-objects

这个代码是UB吗?

struct A
{
 void nonconst() {}
};

const A& a = A{};
const_cast<A&>(a).nonconst();
Run Code Online (Sandbox Code Playgroud)

换句话说,(临时)对象原来是const?我已经查看了标准,但找不到答案,所以会对相关部分的引用表示赞赏.

编辑:对于那些说A{}不是的人const,你能做到A{}.nonconst()吗?

Oli*_*liv 9

参考的初始化a[dcl.init.ref]/5(粗矿)给出:

否则,如果是初始化表达式

  • 是一个右值(但不是一个位域)[...]

那么第一种情况下的初始化表达式的值和第二种情况下的转换结果称为转换的初始化程序. 如果转换的初始值设定项是prvalue,则将其类型T4调整为键入"cv1 T4"([conv.qual])并应用临时实现转换([conv.rval]).

所以这意味着初始化引用的类型prvalue表达式A{}被调整为const A.

然后[conv.rval]说明:

类型T的prvalue可以转换为类型T的xvalue.此转换初始化类型为T的临时对象([class.temporary]).

因此绑定到引用的临时对象的类型与调整后的prvalue类型相同:const A.

所以代码const_cast<A&>(a).nonconst();未定义的行为.