R. *_*des 9 c++ g++ clang sfinae c++11
考虑以下程序:
#include <type_traits>
enum class dummy {};
template <typename T>
using EnableIf = typename std::enable_if<T::value, dummy>::type;
template <typename T>
using DisableIf = typename std::enable_if<!T::value, dummy>::type;
template <typename T>
struct dependent_true_type : std::true_type {};
template <typename T,
EnableIf<dependent_true_type<T>>...>
std::true_type f();
template <typename T,
DisableIf<dependent_true_type<T>>...>
std::false_type f();
static_assert(decltype(f<int>())::value, "");
int main() {}
Run Code Online (Sandbox Code Playgroud)
GCC 4.7 glady接受这个程序.我最近的clang 3.1 build声称呼叫f是模棱两可的.
test.c++:22:24: fatal error: call to 'f' is ambiguous
static_assert(decltype(f<int>())::value, "");
^~~~~~
test.c++:17:16: note: candidate function [with T = int, $1 = <>]
std::true_type f();
^
test.c++:20:17: note: candidate function [with T = int, $1 = <>]
std::false_type f();
^
1 error generated.
Run Code Online (Sandbox Code Playgroud)
如果我写,它确实接受该程序f<int, dummy{}>().
当包是空的时,似乎clang不考虑参数包的类型,这导致不从候选集中删除它.GCC似乎在参数包类型上执行替换,即使包是空的,并且因为所述替换在一次重载时失败,所以没有歧义.
哪两个是正确的?
| 归档时间: |
|
| 查看次数: |
615 次 |
| 最近记录: |