Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.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++ “std::exchange”不是“constexpr”有什么原因吗?_C++_C++14_Std_Constexpr - Fatal编程技术网

C++ “std::exchange”不是“constexpr”有什么原因吗?

C++ “std::exchange”不是“constexpr”有什么原因吗?,c++,c++14,std,constexpr,C++,C++14,Std,Constexpr,,在C++14中引入,指定如下: 就我所见,没有什么可以阻止std::exchange被标记为constepr我有什么原因不知道为什么它不能是constexpr,或者这只是一个疏忽吗?从最新的C++20草案开始,在std::exchange被接受之后,许多算法都可以是constexpr,而不仅仅是这个。你为什么不写一份标准提案,让它们成为constexpr呢?(我是认真的)你能推荐一个使用std::exchangebeconstepr会带来好处的用例吗?@Ron-即使它们在编译时是已知的,即co

,在C++14中引入,指定如下:


就我所见,没有什么可以阻止
std::exchange
被标记为
constepr
我有什么原因不知道为什么它不能是
constexpr
,或者这只是一个疏忽吗?

从最新的C++20草案开始,在
std::exchange
被接受之后,许多算法都可以是constexpr,而不仅仅是这个。你为什么不写一份标准提案,让它们成为constexpr呢?(我是认真的)你能推荐一个使用
std::exchange
be
constepr
会带来好处的用例吗?@Ron-即使它们在编译时是已知的,即
constepr
本身,对于
obj
,它仍然是一个隐含的
const
。因此,如果在需要常量表达式的上下文中调用该函数,则该函数的格式是错误的。把它变成
constexpr
纯粹是愚蠢。一个明确的危险因素。@Rakete1111:我的意思是:如果可以在编译时调用它,那么这意味着
obj
constepr
。如果是这样的话,
std::move(obj)
有意义吗?如果obj是
constexpr
,它不是不可移动的吗?@Nawaz在我看来,这是一个愚蠢的决定,尽管是无害的。但这就是答案,所以+1就是了。@StoryTeller为什么这么愚蠢?如果没有它,在cppreference中创建移动构造函数和赋值
constepr
就不会有任何意义。@raket1111-你会在哪里使用这个移动构造函数?@raket1111-一个原本
constepr
的对象不会被移动(隐含的
const
会妨碍移动)。使用它作为一个动词在一个SCONExPR函数中,正如你所展示的纳瓦兹,不过是一个我没有考虑的有效点(我感谢你提出它)。然而,我仍然认为它的实用性不是太大。@StoryTeller引用Herb Sutter的旅行报告:“在这次会议上,进化小组还临时允许constexpr(编译时)new、vector和string”。。。如果这是未来的趋势,那么如果希望算法在运行时也能高效运行,就需要移动语义在constexpr函数中工作
template< class T, class U = T >
T exchange( T& obj, U&& new_value );
template<class T, class U = T>
T exchange(T& obj, U&& new_value)
{
    T old_value = std::move(obj);
    obj = std::forward<U>(new_value);
    return old_value;
}