【发布时间】:2020-09-26 01:06:25
【问题描述】:
据我了解,给出以下代码:
template<int N>
int i = i<N - 1> + i<N - 1>; // primary variable template
template<> int i<0> = 1; // and explicit specialization
以下程序必须返回 2:
int main () { return i<1>; }
但是这个程序可以返回 0 或 4:
int main () { return i<2>; }
因为评估i<2> 的实例化给出:
int i<2> = i<1> + i<1>; // generated by the compiler
这里,由于i<1> 只是隐式实例化,因此编译器可以使用i<1> 的静态初始化值0,也可以使用动态初始化值2。
这里有一个comparison 不同的编译器给出不同的输出(clang 返回 0,gcc 返回 4)。
问题是——这个程序可以返回 2 吗?
int main () { return i<2>; }
即在i<2>的初始化中,i<1>的不同用途可以使用不同的初始化吗?程序可以完全返回一些其他值吗?
【问题讨论】:
-
"
i<1>的静态初始化值,即 0" - 你从哪里得到 0?您自己在该声明上方说过i<1>必须改为 2。 -
@RemyLebeau 来自here。此外,在第一个示例中,
i<1>必须动态初始化,因为它已被使用。但是在第二个程序中i<1>没有明确使用,所以可以使用静态初始化的版本。稍微修改了一下问题,希望对您有所帮助。 -
我在这段代码中看不到任何会导致该文章中描述的零初始化
-
@RemyLebeau 够公平的。我并不是说我的解释绝对正确。链接中的clang输出怎么样?那你认为这是一个错误吗?
-
我不知道,因为我现在看不到该链接上的输出。我现在正在打电话,那个网站对移动设备来说太可怕了
标签: c++ initialization language-lawyer