提问人:Blackteahamburger 提问时间:10/7/2022 最后编辑:Blackteahamburger 更新时间:10/16/2022 访问量:164
为什么 std::valarray 的帮助程序类的某些赋值运算符返回 void?
Why do some assignment operators for the helper classes of std::valarray return void?
问:
例如,赋值运算符: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&
它禁止某些代码,例如:
std::valarray<int> va{1, 2, 3, 4, 5, 6};
va[std::slice(3, 2, 2)] = va[std::slice(0, 2, 2)] = va[0];
为什么?
答:
2赞
Burak
10/15/2022
#1
虽然返回引用是实现的常见且合理的方法,但请记住,这是一个很少使用且不受支持的库。有关此主题的更详细答案,请参阅 C++ valarray 与 vector。operator=
valarray
从其中一个答案:
ISTR认为,它没有从标准中删除的主要原因是没有人花时间彻底评估这个问题并写一份删除它的提案。
甚至在讨论意见之前,当前的实现中就存在错误。例如,请参阅分配给 gslice_array 会产生运行时错误。
评论
1赞
Blackteahamburger
10/15/2022
赋值运算符返回一定是有原因的,你没有回答我的问题。此外,我认为它是优化性能的好工具。void
1赞
Burak
10/16/2022
@Blackteahamburger 为什么不作废?您正在调用 .常见的返回值应该是 本身,它已经由某些值分配。为了使示例正常工作,返回值应为 或 。虽然你的主意不是一个坏主意,但它是基于意见的,与普遍的期望背道而驰。slice_array
slice_array
const T&
const valarray<T>&
0赞
Blackteahamburger
10/16/2022
怎么了?例如,另一个代理类的赋值运算符是 和 。std::bitset::reference
reference& operator=( bool x ) noexcept;
reference& operator=( const reference& x ) noexcept;
0赞
Burak
10/16/2022
@Blackteahamburger隐式强制转换为 。为了获得相同的效果,应该有一个隐式强制转换,这意味着一个不可见的昂贵复制操作。bitset::reference
bool
slice_array
valarray
0赞
Blackteahamburger
10/22/2022
我不明白为什么需要转换,返回的本身可以用于分配给其他 s 或 s,这也是返回自己的目的。slice_array
slice_array
valarray
评论