C++ 这个静态断言会被触发吗? 模板 自动运算符+(积分左、常数内和右) ->Int { 静态_断言(std::is_integral::value,“不允许非整数类型”); 静态_断言(std::is_integral::value,“不允许非整数类型”); 自动数据=左+右。获取_数据(); Int结果(数据); 返回结果; }
关键是我不认为这两个静态断言会被触发——即使有人也会尝试。C++ 这个静态断言会被触发吗? 模板 自动运算符+(积分左、常数内和右) ->Int { 静态_断言(std::is_integral::value,“不允许非整数类型”); 静态_断言(std::is_integral::value,“不允许非整数类型”); 自动数据=左+右。获取_数据(); Int结果(数据); 返回结果; },c++,c++11,static-assert,C++,C++11,Static Assert,关键是我不认为这两个静态断言会被触发——即使有人也会尝试。 那么这个问题的答案是什么呢?std::string x; template<class Int_T,class Integral,typename Best_Fit<Int_T>::type Min_Range, typename Best_Fit<Int_T>::type Max_Range> auto operator+(Integral left,const Int<Int_T,M
那么这个问题的答案是什么呢?
std::string x;
template<class Int_T,class Integral,typename Best_Fit<Int_T>::type Min_Range,
typename Best_Fit<Int_T>::type Max_Range>
auto operator+(Integral left,const Int<Int_T,Min_Range,Max_Range>& right)
->Int<decltype(left + right.get_data())>
{
static_assert(std::is_integral<Integral>::value,"Non integral type is not allowed.");
static_assert(std::is_integral<Int_T>::value,"Non integral type is not allowed.");
auto data = left + right.get_data();
Int<decltype(left + right.get_data())> result(data);
return result;
}
Int i;
自动z=x+i;
触发了它。我不明白为什么不,你可以找到一个满足约束条件的类(
最佳匹配
和Int
-不管它们是什么),但是失败了是积分
…我认为没有Int
的定义是不可能回答的,最合适
,因为任何人都可能触发SFINAE@sehe&&Kerrek很抱歉没有提供这些DEF。请在这里找到它们:@KerrekSB可以升级为更大的类型,例如,如果Integral
的排名高于Int\u T
@LucDanton:哦,是的,我误解了。不要介意!真奇怪。我本以为decltype(left+right.get_data())
会退出操作符+
。事实上,我无法在我的GCC副本上复制您的发现。好吧,尝试任何可转换或可添加到int
的类型,即使SFINAE也帮不了您。例如,double
std::string
不是这样的类型。不,不是这样的,而且看起来GCC将SFINAEstd::string
输出,而MSVC在这种情况下不执行SFINAE。但是,即使在GCC上,像double
这样的类型也允许在不传递is_integral
的情况下添加到int
。
std::string x;
Int<int, 3, 5> i;
auto z = x + i;
struct dummy {
operator int() const
{ return 0; }
};
// Where rhs has appropriate type
dummy() + rhs;