【问题标题】:Why do some assignment operators for the helper classes of std::valarray return void?为什么 std::valarray 的辅助类的某些赋值运算符返回 void?
【发布时间】:2022-10-07 17:44:19
【问题描述】:

例如,std::slice_array 的赋值运算符:

void operator=(const valarray<T>&) const; //#1
void operator=(const T&) const; //#2
const slice_array& operator=(const slice_array&) const; //#3

#1#2 返回 void,但 #3 返回 const slice_array&amp;

它禁止一些合理的代码,例如:

std::valarray<int> va{1, 2, 3, 4, 5, 6};
va[std::slice(3, 2, 2)] = va[std::slice(0, 2, 2)] = va[0];

为什么?

    标签: c++ assignment-operator valarray


    【解决方案1】:

    大概是因为 C++17 在赋值的左侧和右侧之间引入了从右到左的顺序时忽略了。

    在 C++17 之前,序列可能是一些从左到右的变体,例如:

    va[std::slice(3, 2, 2)] = va[std::slice(0, 2, 2)]; // lhs or rhs evaluated first
    va[std::slice(0, 2, 2)] = va[0];                   // lhs or rhs evaluated first  
    

    如果返回对 *this 的引用而不是 void,则不会产生自 C++17 以来得到的直观结果:

    va[std::slice(0, 2, 2)] = va[0];                   // rhs evaluated first
    va[std::slice(3, 2, 2)] = va[std::slice(0, 2, 2)]; // rhs evaluated first
    

    通过不允许va[std::slice(3, 2, 2)] = va[std::slice(0, 2, 2)] = va[0];,他们(委员会)确保程序员不会在不同的实现中得到不同的结果。

    【讨论】:

      猜你喜欢
      • 2017-03-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 2015-07-16
      相关资源
      最近更新 更多