c++:允许临时对象调用非常量成员函数的设计理念是什么?

Han*_*IAO 6 c++ constants temporary member-functions

我搜索堆栈溢出,人们说修改临时对象是愚蠢的,因此不允许将临时对象绑定到非常量左值引用,就像您不能将临时对象传递给具有非常量左值引用的函数一样。

那么为什么允许临时对象调用有可能修改对象并做“愚蠢”事情的非常量成员函数呢?你可能会说,“哈,这是允许的,因为我们想为程序员提供一些灵活性,让他们做一些实际上并不那么愚蠢的“愚蠢”的事情”,这就是我很难买的原因,因为如果我买这个借口,我认为“将临时绑定到非常量左值引用”可以使用相同的原因来证明是合理的。

谢谢!我在这里几乎找不到任何相关问题。他们只是告诉我这是一个例外,但为什么我们允许这个例外呢?

n. *_* m. 5

您不能将临时对象绑定到非常量引用,但这里的基本原理并不是为了避免临时对象的意外修改。理由是您不想默默地错过修改您想要修改的内容。

想象一下这是允许的,那么:

void foo(double& x);
int y;
foo(y); //user wants to modify y, but instead a temporary is modified
Run Code Online (Sandbox Code Playgroud)

就其本身而言,修改临时对象是完全可以的并且通常很有用。没有理由禁止它。


Han*_*IAO 1

好的,我在这里添加一些额外的材料。以下资料引用自David Vandevoorde、Nicolai M. Josuttis、Douglas Gregor-C++ Templates_ The Complete Guide-Addison-Wesley (2017)C.2.1 The Implied Argument For Member Functions。

\n\n
\n

\xe2\x80\x9c旧的特殊情况允许将右值绑定到对非常量类型的左值\n引用,当该引用是传统的\n隐式 *this 参数\xe2\x80\x9d

\n
\n\n
struct S{\n    void f1() {}//the old rule\n    void f2() && {}\n    void f3() & {}\n};\nint main()\n{\n    S().f1();//Here, I THINK const this is bound to non-const, thus allowing calling non-const member functions.(the comment here is not quoted from the book.)\n    S().f2();\n    S().f3();//not okay\n    return 1;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用-std=c++11编译选项。\n因此,这意味着 C++ 设计者已经意识到允许具有隐式 的临时对象调用非常量成员函数的旧规则const this*不太好。所以在 C++11 中他们引入了函数声明&&&添加后缀。

\n\n

但是当涉及到允许临时对象调用非常量成员函数的旧规则的设计理念时,我认为不值得深入探讨这一点。C++ 11 已经努力“修正”这一点。(或者让程序员控制这一点。)

\n