【发布时间】:2012-05-09 18:27:21
【问题描述】:
考虑以下程序:
#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() {}
GCC 4.7 高兴接受这个程序。我最近的 clang 3.1 版本声称对 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.
如果我写f<int, dummy{}>(),它确实接受程序。
当包为空时,似乎clang没有考虑参数包的类型,这导致没有将其从候选集中删除。即使包为空,GCC 似乎也会对参数包类型执行替换,并且由于所述替换因一次重载而失败,因此没有歧义。
这两个哪个是正确的?
【问题讨论】:
标签: c++ c++11 g++ clang sfinae