gpt4 book ai didi

c++ - 何时实例化模板非静态数据成员初始化程序?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:31:21 26 4
gpt4 key购买 nike

这是一个简短的独立测试用例来解释我的问题。 GCC 接受此代码,但 clang 和 Intel 拒绝它:

template <typename T>
struct false_t {
static const bool value = false;
};
template <typename T>
int f() {
static_assert(false_t<T>::value, "");
return 0;
}
template <typename T>
struct S {
int m = f<T>();
};
int s = sizeof(S<int>);

或者,根据 pmr 的评论,这里有一个更简单的示例,它也被 gcc 接受并被 clang 拒绝:

struct S;
template <typename T> struct X { int x = T(); };
int s = sizeof(X<S>);

sizeof(S<int>) (或 sizeof(X<S>) )应该实例化它需要的类的位,但编译器不同意这些是哪些位。由于非静态数据成员初始化程序只能由构造函数使用,因此 GCC 将实例化作为实例化类的构造函数的一部分来执行。 clang 和英特尔更早这样做。

我无法理解 [temp.inst]p1 中的标准内容:

The implicit instantiation of a class template specialization causes the implicit instantiation of the declarations, but not of the definitions or default arguments, of the class member functions, member classes, scoped member enumerations, static data members and member templates; and it causes the implicit instantiation of the definitions of unscoped member enumerations and member anonymous unions.

因为我根本看不到非静态数据成员(有或没有初始化程序)的声明在哪里被实例化。

有关我在哪里遇到此问题的更多详细信息:我正在尝试创建一个模板帮助程序类(永远不会在运行时创建),其中包含一个使用 std::declval<T>() 初始化的成员(我应该补充一点,我现在意识到无论如何用处不大),以及 libstdc++ 对 std::declval 的实现。包含一个静态断言,就像我的示例中的那样。我可以通过避免 std::declval 来轻松解决这个问题。 , 但我想知道标准要求什么。

最佳答案

在试图弄清楚如何提出这个问题时,我偶然发现了答案,但我认为无论如何发帖可能会有用。

这是 C++ 标准的未决问题之一,issue 1396准确地说。目的是初始化器只在需要时被实例化:

Non-static data member initializers get the same late parsing as member functions and default arguments, but are they also instantiated as needed like them? And when is their validity checked?

Notes from the October, 2012 meeting:

CWG agreed that non-static data member initializers should be handled like default arguments.

但是这种方法还有很多问题有待解决。在它们被解决之前,不同的编译器在不同的时间执行实例化是很自然的,需要特定行为的代码应该被重写以避免这样的要求。在我的例子中,这意味着不使用 std::declval

关于c++ - 何时实例化模板非静态数据成员初始化程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21803992/

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