const的目的是什么?
const Object myFunc(){
return myObject;
}
Run Code Online (Sandbox Code Playgroud)
我刚刚开始阅读Effective C++,而第3项提倡这一点,Google搜索也提出了类似的建议,但也有反作用.我看不出在这里使用const会更好.假设需要按值返回,我认为没有任何理由保护返回的值.给出为什么这可能有用的示例是防止返回值的意外bool强制转换.实际问题是应该使用explicit关键字来防止隐式bool强制转换.
在这里使用const可以防止在没有赋值的情 所以我无法用这些对象执行算术表达式.似乎没有一个未命名的const有用的情况.
在这里使用const获得了什么,何时更可取?
编辑:将算术示例更改为修改在分配之前可能要执行的对象的任何函数.
对于类类型,可以分配实际上不允许内置类型的临时对象.此外,默认生成的赋值运算符甚至会产生左值:
int() = int(); // illegal: "expression is not assignable"
struct B {};
B& b = B() = B(); // compiles OK: yields an lvalue! ... but is wrong! (see below)
Run Code Online (Sandbox Code Playgroud)
对于最后一个语句,赋值运算符的结果实际上用于初始化非const引用,该引用将在语句之后立即变为陈旧:引用未直接绑定到临时对象(它不能作为临时对象只能是绑定到一个const或右值引用)但绑定到其生命周期未延长的赋值结果.
另一个问题是从赋值运算符返回的左值看起来不像它可以被移动,尽管它实际上是指临时的.如果有任何东西使用赋值的结果来获取值,它将被复制而不是移动,尽管移动是完全可行的.此时值得注意的是,问题是根据赋值运算符描述的,因为此运算符通常可用于值类型并返回左值引用.任何返回对象引用的函数都存在同样的问题,即*this.
一个潜在的解决方法是重载赋值运算符(或返回对象引用的其他函数)以考虑对象的类型,例如:
class G {
public:
// other members
G& operator=(G) & { /*...*/ return *this; }
G operator=(G) && { /*...*/ return std::move(*this); }
};
Run Code Online (Sandbox Code Playgroud)
C++ 11提供了如上所述重载赋值运算符的可能性,并且可以防止上面提到的细微对象失效并同时允许将赋值结果移动到临时值.这两个运营商的实施可能完全相同.虽然实现可能相当简单(基本上只是swap()两个对象中的一个),但它仍然意味着提出问题的额外工作:
返回对象的引用的函数(例如,赋值运算符)是否应该观察被赋值对象的右值?
另外一个(在评论中由Simple提到)是不重载赋值运算符,但是使用a &来限制它的使用到lvalues:
class GG {
public:
// other …Run Code Online (Sandbox Code Playgroud)