在读<<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 函数合法性,我的理解正确吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.