【发布时间】:2013-03-06 13:42:08
【问题描述】:
这里的“不依赖”是指“不依赖于该特定函数模板的任何其他模板参数”。
在回答this question 时,我以为我找到了答案,但根据@Johannes(在我的回答的 cmets 中),我在这里误解了标准。举个简单的例子:
#include <type_traits>
template<class T>
struct X{
template<class U = typename T::type>
static void foo(int){}
static void foo(...){}
};
int main(){
X<std::enable_if<false>>::foo(0);
}
是否可以保证上述编译成功? GCC 和 Clang 在这里不同意,正如在实时版本中切换它们时所看到的那样。但有趣的是,GCC 接受了以下内容:
#include <type_traits>
template<class T>
struct X{
template<bool = T::f()>
static void foo(int){}
static void foo(...){}
};
struct Y{
static bool f(){ return true; }
};
int main(){
X<Y>::foo(0);
}
如果T 包含constexpr 静态函数f,第二个sn-p 只会打印foo(int)。再一次,有趣的是,如果你从Y 中完全删除f(或者通过,比如说,int),GCC 会抱怨缺少一个成员,表明它不允许 SFINAE - 这与前面的矛盾观察。 Clang 接受所有变体并应用 SFINAE,我想知道这是否是标准所保证的。
(FWIW,带有 Nov CTP 的 MSVC 通常与 Clang 一致,但如果该函数存在,则在第二个 sn-p 上崩溃,可能是因为它们没有 constexpr。我提交了一个错误报告 here。 )
【问题讨论】:
标签: c++ templates language-lawyer sfinae