【问题标题】:Can static and dynamic template initialization be interleaved?静态和动态模板初始化可以交错吗?
【发布时间】: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&lt;2&gt; 的实例化给出:

int i<2> = i<1> + i<1>;       // generated by the compiler

这里,由于i&lt;1&gt; 只是隐式实例化,因此编译器可以使用i&lt;1&gt; 的静态初始化值0,也可以使用动态初始化值2

这里有一个comparison 不同的编译器给出不同的输出(clang 返回 0,gcc 返回 4)。

问题是——这个程序可以返回 2 吗?

int main () { return i<2>; }

即在i&lt;2&gt;的初始化中,i&lt;1&gt;的不同用途可以使用不同的初始化吗?程序可以完全返回一些其他值吗?

【问题讨论】:

  • "i&lt;1&gt; 的静态初始化值,即 0" - 你从哪里得到 0?您自己在该声明上方说过 i&lt;1&gt; 必须改为 2。
  • @RemyLebeau 来自here。此外,在第一个示例中,i&lt;1&gt; 必须动态初始化,因为它已被使用。但是在第二个程序中i&lt;1&gt; 没有明确使用,所以可以使用静态初始化的版本。稍微修改了一下问题,希望对您有所帮助。
  • 我在这段代码中看不到任何会导致该文章中描述的零初始化
  • @RemyLebeau 够公平的。我并不是说我的解释绝对正确。链接中的clang输出怎么样?那你认为这是一个错误吗?
  • 我不知道,因为我现在看不到该链接上的输出。我现在正在打电话,那个网站对移动设备来说太可怕了

标签: c++ initialization language-lawyer


【解决方案1】:

您从Recursive computation using variable templates - gcc vs clang 知道i&lt;1&gt;i&lt;2&gt; 的动态初始化是不确定的。不确定顺序的评估不能交错(重叠):

AB 之前排序时,

评估 ABindeterminately sequenced B

A 之前排序,但未指定哪个。 [ 注意:不确定顺序的评估不能重叠,但可以先执行。 — 尾注 ]

所以在int i&lt;2&gt; = i&lt;1&gt; + i&lt;1&gt;;的动态初始化中,i&lt;1&gt;的静态值或动态值都用于两个被加数,这取决于i&lt;1&gt;的动态初始化是否已经发生。

【讨论】:

    【解决方案2】:

    i&lt;1&gt; 的静态初始化值,即 0

    你从哪里得到 0?您自己在该声明的上方说过i&lt;1&gt; 必须是2。

    所以,给定:
    i&lt;0&gt; = 1
    并且:
    i&lt;1&gt; = i&lt;0&gt; + i&lt;0&gt; = 1 + 1 = 2
    并且:
    i&lt;2&gt; = i&lt;1&gt; + i&lt;1&gt;
    然后:
    i&lt;2&gt; = 2 + 2 = 4

    只能是 4。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 2017-03-24
      相关资源
      最近更新 更多