【发布时间】:2021-04-24 00:46:26
【问题描述】:
标准在 [temp.res]/8 中说:
对于可以生成有效特化的模板定义,不应发出诊断。如果无法为模板定义生成有效的特化,并且该模板未实例化,则模板定义格式错误,无需诊断。 ... [注:如果模板被实例化,错误将根据本标准中的其他规则进行诊断。准确诊断这些错误的时间是实施质量问题。 ——尾注]
我的问题是:以下是否算作可以生成的有效专业化?
#include <type_traits>
template <typename T, typename Enable = void>
class A;
template <typename T>
class A<T, typename std::enable_if<not std::is_same<T, int>::value>::type>
{
public:
static_assert(std::is_same<T, int>::value, "should not be here!");
};
一方面,static_assert 本质上等于static_assert(false, "should not be here");(我们不能既不是int 又不是int),这是不允许的。另一方面,就 SFINAE 而言,类型,例如,A<double> 格式完美,可以生成,但会立即抛出静态断言失败。这目前在 GCC 8.3 中有效,但鉴于上述标准引用的“格式错误,无需诊断”部分,我想确保它实际上应该工作. (注意:这里的工作被定义为如果我尝试实例化 A<double> 会抛出 static assertion 失败,如果我不这样做则静默编译)
【问题讨论】:
-
我很困惑。什么有效?我们在谈论“作品”的什么定义?
-
@StoryTeller-UnslanderMonica:添加了一个括号以希望澄清
标签: c++ c++11 language-lawyer