Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么性病:任何&;ValueType的运算符=不是有条件的noexcept?_C++_C++17_Assignment Operator_Any_Noexcept - Fatal编程技术网

C++ 为什么性病:任何&;ValueType的运算符=不是有条件的noexcept?

C++ 为什么性病:任何&;ValueType的运算符=不是有条件的noexcept?,c++,c++17,assignment-operator,any,noexcept,C++,C++17,Assignment Operator,Any,Noexcept,问题很简单 这是std::any的模板运算符=的声明: template<typename ValueType> any& operator=( ValueType&& rhs ); 模板 any&运算符=(ValueType&&rhs); 我希望是: template<typename ValueType> any& operator=( ValueType&& rhs ) noexcept(noexcept(std:

问题很简单

这是
std::any
的模板运算符=的声明:

template<typename ValueType>
any& operator=( ValueType&& rhs );
模板
any&运算符=(ValueType&&rhs);
我希望是:

template<typename ValueType>
any& operator=( ValueType&& rhs ) noexcept(noexcept(std::declval<std::any>() = std::forward<ValueType>(std::declval<ValueType>()));
模板
any&operator=(ValueType&&rhs)noexcept(noexcept(std::declval()=std::forward(std::declval());
也就是说,如果您可以以noexcept的方式将assign ValueType复制到任何对象,那么您应该能够拥有noexcept


也许我遗漏了什么。

字面上的答案是这样一个规范是递归的(如果赋值是
noexcept
,你是说赋值应该是
noexcept

但可能更有用的答案是,由于
任何
可能都必须分配,因此只有在
衰退
发生的情况下,您才能真正拥有
无例外
分配

  • 足够小(以便不需要分配),以及
  • nothrow move可构造,以及
  • ValueType
指定
noexcept
条件的唯一方法将要求您还指定“足够小”的含义,这将限制实现自由度,从而获得可疑的收益

标准库通常不使用条件noexcept-那么为什么这会是…异常呢

模板any&operator=(T&&rhs);

-抛出:所选VT构造函数抛出的任何异常

如果
ValueType
是可复制构造的,则您显示的重载仅参与重载解析,这为
ValueType
的复制构造在
std::any
分配期间打开了大门


请注意,您还显示了一个根据定义的同一操作定义的
noexcept
规范。

我觉得这并不能真正回答这个问题。是的,
decation\u t
必须是可复制构造的。那么,是否可以定义一个操作符
noexcept
,即使它的效果是抛出所抛出的内容r抛出
T
的复制构造函数?