gpt4 book ai didi

c++ - 未实例化的模板的C++标准要求

转载 作者:行者123 更新时间:2023-12-02 10:35:22 25 4
gpt4 key购买 nike

所以我尝试编译下面的代码,但失败了(如预期的那样):

1.cpp: In function ‘int foo()’:
1.cpp:3:5: error: ‘some’ was not declared in this scope
some ill-formed code
^

但是,如果我删除了这一行,编译器将对其进行编译而不会出现任何错误(这也是预期的,因为不知道 T类型是否具有 random_name()方法)。

似乎在某种程度上定义了对未使用(未实例化)模板的诊断。但是也许标准对这种情况有一些要求。例如,编译下面的代码没有任何错误是否符合标准?

我试图在网站上搜索答案,但是找不到任何相关问题。
template <class T>
int foo() {
some ill-formed code
return T::random_name();
}

template <>
int foo<int>() { return 0; }

int main() {
return foo<int>();
}

最佳答案

这是实现质量的问题,格式不正确,但是如果未实例化,则按照[temp.res#8.1]p不需要诊断:

The validity of a template may be checked prior to any instantiation. [ Note: Knowing which names are type names allows the syntax of every template to be checked in this way. — end note  ] 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, or


并且我们可以看到 from this live godbolt example MSVC无法诊断这种情况。这是因为 MSVC is not using two-phase lookup但使用 /permissive-会对此进行更改。 clang使用 -fdelayed-template-parsing甚至有一个 MSVC compatibility mode to emulate this

我们可以看到 from this live godbolt using these two options clang不再产生诊断信息,但MSVC会发出诊断信息。

关于c++ - 未实例化的模板的C++标准要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60587723/

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