gpt4 book ai didi

c++ - 如果 constexpr 和 dependent false static_assert 格式错误?

转载 作者:太空狗 更新时间:2023-10-29 20:49:40 25 4
gpt4 key购买 nike

A related questionstatic_assert 中提供类型无关的 false 示例:

template<class T> void foo()
{
if constexpr(false)
static_assert(false);
}

但是,我更担心的是,如果同样的事情适用于类型相关的 false。以下是标准中的相关引述:

The program is ill-formed, no diagnostic required, if no valid specialization can be generated for a template or a substatement of a constexpr if statement within a template and the template is not instantiated. § 13.7/8.1

这让我感到惊讶,因为我经常看到以下成语:

template<class T> void foo()
{
if constexpr(cond)
// ...
else
static_assert(!std::is_same_v<T, T>);
}

事实上,cppreference甚至提供了an example同样的事情:

template<class T> struct dependent_false : std::false_type {};
template<class T> void foo()
{
if constexpr (cond)
// ...
else
static_assert(dependent_false<T>::value);
}

根据我的理解,在这两种情况下,都无法为相关的 if constexpr 子语句生成有效的特化,因此格式错误,不需要诊断。我说得对吗?

最佳答案

no valid specialization can ever be generated for the relevant if constexpr substatements

嗯,不。

如果您特化了dependent_false,您就可以拥有该分支的有效特化第一:

template <> struct dependent_false<int> : std::true_type {};
///
foo<int>(); // <-- A valid specialization for the `else` branch is possible here

可以创建这样的专业(即使您没有)这一事实使得 static_assert(dependent_false<T>::value);格式良好。

另一方面,static_assert(!std::is_same_v<T, T>);是格式错误的 NDR,因为专门化来自 std:: 的模板不被允许。

关于c++ - 如果 constexpr 和 dependent false static_assert 格式错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57812038/

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