gpt4 book ai didi

c++ - 如果临时对象是隐式不可修改的,这是如何工作的?

转载 作者:可可西里 更新时间:2023-11-01 14:54:38 24 4
gpt4 key购买 nike

我是 told也就是说,在 C++03 中,临时变量是隐式不可修改的。

但是,以下compiles for me on GCC 4.3.4 (在 C++03 模式下):

cout << static_cast<stringstream&>(stringstream() << 3).str();

这是如何编译的?

(我不是谈论关于临时绑定(bind)到引用的规则。)

最佳答案

I'm told that, in C++03, temporaries are implicitly non-modifiable.

这是不正确的。在其他情况下,临时对象是通过计算右值来创建的,并且有非 const rvalues 和 const rvalues。表达式的值类别和它表示的对象的常量性大多是正交的1。观察:

      std::string foo();
const std::string bar();

给定上述函数声明,表达式 foo() 是一个非常量右值,其计算创建一个非常量临时值,而 bar() 是一个 const创建 const 临时值的右值。

请注意,您可以在非 const 右值上调用任何成员函数,从而允许您修改对象:

foo().append(" was created by foo")   // okay, modifying a non-const temporary
bar().append(" was created by bar") // error, modifying a const temporary

由于 operator= 是一个成员函数,您甚至可以分配给非常量右值:

std::string("hello") = "world";

这应该足以让您相信临时变量不是隐式常量。

1:一个异常(exception)是标量右值,例如 42。They are always non-const .

关于c++ - 如果临时对象是隐式不可修改的,这是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6466253/

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