为什么 std::valarray 的帮助程序类的某些赋值运算符返回 void?

Why do some assignment operators for the helper classes of std::valarray return void?

提问人:Blackteahamburger 提问时间:10/7/2022 最后编辑:Blackteahamburger 更新时间:10/16/2022 访问量:164

问:

例如,赋值运算符: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并返回 ,但返回 。#2void#3const slice_array&

它禁止某些代码,例如:

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++ 赋值运算符 代理类 valarray

评论

1赞 Konrad Rudolph 10/7/2022
这是否是合理的代码当然是一个有争议的问题。;-)
0赞 Blackteahamburger 10/7/2022
@KonradRudolph 这只是一个玩具的例子,没关系。
1赞 j6t 10/15/2022
@Blackteahamburger 这就是重点。找一个合理的例子,而不是一个玩具,其中链式分配是有意义的,具有明确明确的含义,并且链式分配明显优于两个单独的分配。
0赞 Blackteahamburger 10/15/2022
@j6t 没有必要“明显更好”,它只是更方便。我删除了“合理”。

答:

2赞 Burak 10/15/2022 #1

虽然返回引用是实现的常见且合理的方法,但请记住,这是一个很少使用且不受支持的库。有关此主题的更详细答案,请参阅 C++ valarray 与 vectoroperator=valarray

从其中一个答案:

ISTR认为,它没有从标准中删除的主要原因是没有人花时间彻底评估这个问题并写一份删除它的提案。

甚至在讨论意见之前,当前的实现中就存在错误。例如,请参阅分配给 gslice_array 会产生运行时错误

评论

1赞 Blackteahamburger 10/15/2022
赋值运算符返回一定是有原因的,你没有回答我的问题。此外,我认为它是优化性能的好工具。void
1赞 Burak 10/16/2022
@Blackteahamburger 为什么不作废?您正在调用 .常见的返回值应该是 本身,它已经由某些值分配。为了使示例正常工作,返回值应为 或 。虽然你的主意不是一个坏主意,但它是基于意见的,与普遍的期望背道而驰。slice_arrayslice_arrayconst T&const valarray<T>&
0赞 Blackteahamburger 10/16/2022
怎么了?例如,另一个代理类的赋值运算符是 和 。std::bitset::referencereference& operator=( bool x ) noexcept;reference& operator=( const reference& x ) noexcept;
0赞 Burak 10/16/2022
@Blackteahamburger隐式强制转换为 。为了获得相同的效果,应该有一个隐式强制转换,这意味着一个不可见的昂贵复制操作。bitset::referenceboolslice_arrayvalarray
0赞 Blackteahamburger 10/22/2022
我不明白为什么需要转换,返回的本身可以用于分配给其他 s 或 s,这也是返回自己的目的。slice_arrayslice_arrayvalarray