C++ 模板 SFINAE 问题
时间: 2020-08-20来源:V2EX
前景提要
在读<<C++ Templates>>第二版时,有一个模板问题,代码如下:
模板定义: #include <utility> template <typename F, typename... Args, typename = decltype(std::declval<F>()(std::declval<Args &&>()...))> std::true_type isValidImpl(void *); template <typename F, typename... Args> std::false_type isValidImpl(...); inline constexpr auto isValid = [](auto f) { return [](auto &&... args) { return decltype(isValidImpl<decltype(f), decltype(args) &&...>(nullptr)){}; }; }; template <typename T> struct TypeT { using Type = T; }; template <typename T> constexpr auto type = TypeT<T>{}; template <typename T> T valueT(TypeT<T>); constexpr auto isDefaultConstructible = isValid([](auto x) -> decltype((void)decltype(valueT(x))()) {});
如果一个 lambda 函数不执行是不是就不检查返回类型合法性了呢,比如在执行 isDefaultConstructible(type<x>) 命令时,会引入一个 lamda 函数,这个 lambda 函数返回值是 decltype((void)decltype(valueT(x))()) {}) , decltype(valueT(x))() 在 x 是 int 的时候合法,导致最终调用第一个 isValidImpl 函数,x 是 int&的时候不合法,把第一个 isValidImpl SFINAE out,调用第二个此优先级 isValidImpl 函数,即使 isValid 传入的是一个不合法 lambda 函数,但是由于没有使用所以没有检查 lambda 函数合法性,我的理解正确吗?

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行