【发布时间】:2020-01-08 17:50:02
【问题描述】:
related question 在static_assert 中提供了与类型无关的false 的示例:
template<class T> void foo()
{
if constexpr(false)
static_assert(false);
}
但是,如果同样的事情适用于依赖类型的false,我更担心。以下是标准中的相关引述:
如果无法为模板或模板中的 constexpr if 语句的子语句生成有效的特化,则程序格式错误,不需要诊断,并且模板未实例化。 § 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 子语句生成有效的专业化,因此格式不正确,不需要诊断。我说的对吗?
【问题讨论】:
标签: c++ language-lawyer