在读<<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 函数合法性,我的理解正确吗?