gpt4 book ai didi

c++ - static_assert 未在模板参数中评估

转载 作者:行者123 更新时间:2023-11-28 01:25:31 36 4
gpt4 key购买 nike

我有这段代码来确定模板类型是否有 foo():

template <typename T, typename = void>
struct has_foo : std::false_type {};

template <typename T>
struct has_foo<T, std::void_t<decltype(std::declval<T&>().foo()) > > : std::true_type {};

template <typename T>
void has_foo_f(){
static_assert(has_foo<T>::value, "Type does not have foo().");
}

然后我有 bar带有 foo 的模板参数的函数:

template<typename T, typename = decltype(has_foo_f<T>())>
void bar(){}

在主文件中,我有一个失败案例:

//Foo does not implement foo(). It should fail!
template<typename T>
class Foo{};

int main()
{
has_foo_f<Foo<int>>(); //This line fail
bar<Foo<int>>(); //This line does not fail
}

当我调用 has_foo_f直接地,编译器给我静态断言错误,这是正确的。然而,当我调用 bar<Foo<int>> ,编译器编译成功,没有报错。

为什么会这样?为什么不评估 static_assert?我明白decltype不需要评估 static_assert获取类型信息,但不是 static_assert总是在编译时求值?

最佳答案

decltype 的操作数未被评估,因此不需要函数定义存在(或返回类型完整),而函数模板在需要函数定义的上下文中引用特化时实例化存在。所以你需要实例化函数模板来检查函数体内部:

template<typename T, auto Dummy = &has_foo_f<T>>
void bar(){}

关于c++ - static_assert 未在模板参数中评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54045912/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com