C++11 在C++;11应该返回临时返回常量或非常量的函数

C++11 在C++;11应该返回临时返回常量或非常量的函数,c++11,move-semantics,C++11,Move Semantics,在移动构造函数之前,如果返回一个temp,最好让它返回const,以避免有人给temp变量赋值 现在看来,由于move构造函数不处理const返回,所以不返回const似乎是最佳实践 但是,现在您又回到了有人合法分配临时变量的问题 快速示例(假设一个非常昂贵的复制构造函数): 如果operator+返回const MyClass,则不会编译,但任何常规使用都会使用昂贵的复制构造函数而不是廉价的移动构造函数。通过将赋值运算符限制为仅处理左值,可以避免赋值到右值: class MyClass {

在移动构造函数之前,如果返回一个temp,最好让它返回const,以避免有人给temp变量赋值

现在看来,由于move构造函数不处理const返回,所以不返回const似乎是最佳实践

但是,现在您又回到了有人合法分配临时变量的问题

快速示例(假设一个非常昂贵的复制构造函数):


如果
operator+
返回
const MyClass
,则不会编译,但任何常规使用都会使用昂贵的复制构造函数而不是廉价的移动构造函数。

通过将赋值运算符限制为仅处理左值,可以避免赋值到右值:

class MyClass {
  MyClass& operator = (const MyClass& other) & {
    // ...
    return *this;
  }
  MyClass& operator = (MyClass&& other) & {
    // ...
    return *this;
  }
  // or, ideally:
  MyClass& operator = (const MyClass& other) & = default;
  MyClass& operator = (MyClass&& other) & = default;
};

Ref限定符添加到C++11的时间较晚,因此编译器支持最近才开始出现。

通过将赋值运算符限制为仅处理左值,可以避免赋值到右值:

class MyClass {
  MyClass& operator = (const MyClass& other) & {
    // ...
    return *this;
  }
  MyClass& operator = (MyClass&& other) & {
    // ...
    return *this;
  }
  // or, ideally:
  MyClass& operator = (const MyClass& other) & = default;
  MyClass& operator = (MyClass&& other) & = default;
};

Ref限定符添加到C++11的时间较晚,因此编译器支持最近才开始出现。

这到底是一个什么问题?似乎极不可能有人无意中错误地写出这样的片段。我不认为有必要千方百计让它不被编译。嗯,我们可以让编译器为我们执行的任何小事情都更好。这到底是个什么问题?似乎极不可能有人无意中错误地写出这样的片段。我认为不必刻意让它不被编译。IMHO,我们可以让编译器为我们强制执行的任何小事情都更好。虽然在这种情况下它是隐式的,但也可以显式删除
操作符=
s的右值版本。左值版本看起来像什么?(只需省略&)?@Glentitelbaum,它是左值版本-当使用左值对象调用时,编译器将首选具有单个
&
ref限定符的成员函数。当使用右值对象调用时,编译器将首选带有双
&&
ref限定符的成员函数。这就像
const
和非
const
成员函数之间的区别一样。[需要引用]因此:
op=()
用于两个|
op=()&
用于左值|
op=()&&
用于右值,在契约上类似于移动构造函数,因为它应该重置rhs,因此可以进行浅层复制;U U
t=u
将调用
T::op=(常数U&)&
如果存在,或者
T::op=(常数U&)
否则<代码>标准::移动(t)=u将调用
T::op=(常量U&)&&
如果它存在,或者
T::op=(常量U&)
否则。引用限定符约束this指向的对象的可接受值类别,就像成员函数上的
const
volatile
限定符约束this指向的对象的
const
限定一样。尽管在这种情况下它是隐式的,还可以显式删除
运算符=
s的右值版本。左值版本是什么样子的?(只需省略&)?@Glentitelbaum,它是左值版本-当使用左值对象调用时,编译器将首选具有单个
&
ref限定符的成员函数。当使用右值对象调用时,编译器将首选带有双
&&
ref限定符的成员函数。这就像
const
和非
const
成员函数之间的区别一样。[需要引用]因此:
op=()
用于两个|
op=()&
用于左值|
op=()&&
用于右值,在契约上类似于移动构造函数,因为它应该重置rhs,因此可以进行浅层复制;U U
t=u
将调用
T::op=(常数U&)&
如果存在,或者
T::op=(常数U&)
否则<代码>标准::移动(t)=u将调用
T::op=(常量U&)&&
如果它存在,或者
T::op=(常量U&)
否则。引用限定符约束this指向的对象的可接受值类别,就像成员函数上的
const
volatile
限定符约束this指向的对象的
const
限定一样。