【发布时间】:2018-05-06 08:11:57
【问题描述】:
我想写一个模板函数foo,对T类型做一些操作,在这个函数里面T类型的值可以是:
- 已复制
- 已分配
- 用运算符+求和
所以,我需要为这个函数指定 noexcept ,但上面已经提到了限制。
这是我的代码,但它不能正常工作:
template<class T>
void foo()
noexcept(noexcept(std::declval<T>() + std::declval<T>()) && std::is_copy_constructible<T>::value && std::is_assignable<T, T>::value)
{}
bool b1 = noexcept(foo<int>()); // false, but should return true
bool b2 = noexcept(foo<std::string>()); // false
我应该怎么做才能让它正常工作?
【问题讨论】:
-
“所以,我需要为这个函数指定 noexcept” 我看不到因果关系。为什么不简单地使用 sfinae?
-
@YSC 在这种情况下我不能使用 SFINAE
-
这仅在
operator+(T,T)定义为noexcept时有效。什么if it's not? -
@YSC 这只是我尝试用这样的operator+定义这个函数,如果你知道解决这个问题的另一种方法,请写在这里
-
好吧,sfinae 但你说你可以(不被允许?)不可以。