gpt4 book ai didi

c++ - 从非实例化上下文中引用特定模板特化 : instantiation or not?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:24 28 4
gpt4 key购买 nike

考虑下面的例子

template <typename A> struct S 
{
A a;
void foo() {}
};

template <typename T> void bar()
{
S<void> *p = 0;
}

template <typename T> void baz()
{
S<void>{}.foo();
}

template <typename T> void qux()
{
S<void> s{};
}

int main()
{
}

函数模板 bar , bazqux故意不实例化。

baz的定义由于“明显”原因无法在 GCC 和 Clang 中编译 - S<void>S 的无效特化.但是,哪种语言规则适用于这种情况?

  1. 一方面,S<void>不依赖于 baz 的模板参数,成员访问要求它是完整的,这会触发 S<void> 的实例化,失败了。诊断是必需的。

  2. 另一方面,我们有一条笼统的规则“如果不能为非实例化模板生成有效的特化,则代码格式错误”。这使得 baz 的定义成为可能病态的。但是,不需要诊断。

更具体地说,我的假设(如#1 中所述)是否正确,即上述对 S<void> 的引用来自非实例化 baz需要实例化 S<void> ?两个编译器都乐于接受 bar 的定义这一事实支持了这个假设。 ,它没有实例化 S<void> .

然而,上述编译器对 qux 的处理方式不同。 - Clang 提示,而 GCC 毫无怨言地接受它。这是其中一个编译器中的错误吗?这种情况需要诊断吗?还是我假设#1 在这里工作是错误的?如果 #2 是诊断的基础,那么编译器之间的差异是可以接受的。

最佳答案

对于bazqux , 表达式的有效性包括 S<void>只能通过 S 的实例化来完成。然而,编译器没有义务在任何实例化之前执行此验证 [temp.res]/8

The validity of a template may be checked prior to any instantiation. [...  ] The program is ill-formed, no diagnostic required, if:

  • a hypothetical instantiation of a template immediately following its definition would be ill-formed due to a construct that does not depend on a template parameter,

关于c++ - 从非实例化上下文中引用特定模板特化 : instantiation or not?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53686082/

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