gpt4 book ai didi

c++ - 临时对象可以绑定(bind)到非常量引用吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:36:08 25 4
gpt4 key购买 nike

我写了下面的代码来测试这个:

struct X
{
char* x;
X()
{
x = new char('a');
}
~X()
{
*x = 'b';
delete x;
}
};

void foo(const X& x)
{
}
void goo(X& x)
{
}

int main()
{
foo(X());
goo(X());
}

临时对象的析构函数两个函数退出后调用,但我认为您只能将临时对象绑定(bind)到const 引用。为什么 goo 可以工作?

是UB和MSVS错了,还是没问题?

最佳答案

这是违法的。符合规范的实现对其进行诊断(即它必须至少发出警告),但 MSVC++ 允许将其作为扩展。

如果你不友善,也可以是一个错误,但 IIRC 他们仍然允许它的原因是长期存在的遗留原因:名义上支持在 C++ 标准化之前为 MSVC++ 编写的代码,但当然一旦你允许人们编写这个,他们也无意中用新代码编写了它,所以遗产得以延续。如果它是故意的,那么它是一个(错误的)特性,而不是一个错误,对吧?无论如何,需要符合规范的实现来诊断格式错误的程序,因此如果您没有收到警告,则说明编译器不符合规范。

关于c++ - 临时对象可以绑定(bind)到非常量引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10615106/

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