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将SFINAE
std::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;