gpt4 book ai didi

c++ - C++概念assignable_from将不接受const&-returning运算符=

转载 作者:行者123 更新时间:2023-12-01 14:42:41 26 4
gpt4 key购买 nike

在下面的MCVE中,std::assignable_from报告无法从A<double>&分配A<double> -显然可以。

#include <iostream>

template <typename T>
class A
{
public:
const A& operator= (const A& other) { return *this; }
};

int main ()
{
A<double> d1, d2; d1 = d2; //this works fine

std::cout << std::boolalpha
<< "Is double assignable? " << std::assignable_from<double&, double> << '\n' //Says true, as it should
<< "Is A<double> assignable? " << std::assignable_from<A<double>&, A<double>> << '\n'; //Says false

return 0;
}

我知道为什么。 assignable_from期望 operator=的返回类型为 A&,而不是 const A&
template <class _LTy, class _RTy>
concept assignable_from = is_lvalue_reference_v<_LTy>
&& common_reference_with<const remove_reference_t<_LTy>&, const remove_reference_t<_RTy>&>
&& requires(_LTy _Left, _RTy&& _Right) {
{ _Left = static_cast<_RTy&&>(_Right) } -> same_as<_LTy>;
};

除了写我自己的可分配性概念之外,还有其他选择吗?我一直有 =返回 const &,因为我认为说 (A=B)=C是愚蠢的。

最佳答案

I've always had = return const &, because I thought it was dumb to say (A=B)=C.



您可以自由地这样做,但是如果您违反既定的约定,则会产生后果。您遇到了其中之一。 std::assignable_from要求您为赋值运算符遵循已建立的C++约定。这包括在 operator=重载中返回对指定类型的可修改引用。

还应注意,如果从赋值运算符返回 const&,则无法对其进行 =default。 C++对于从赋值运算符返回可修改的引用非常认真。这是该语言的预期组成部分。

当必须将类型传递给受 std::assignable_from或使用它的任何约束的概念化函数/类时,编写自己的分配概念将无济于事。

因此,只需遵循C++的约定。

关于c++ - C++概念assignable_from将不接受const&-returning运算符=,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62317111/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com