内联变量的多次销毁

这是一个包含内联变量的头文件:

// inline.hpp
#pragma once

#include <iostream>

struct Test {
    ~Test() { std::cout << "deleted" << std::endl; }
};

inline const Test test;

...包含在两个.cpp文件中:

// usage.cpp
#include "inline.hpp"
// main.cpp
#include "inline.hpp"
auto main() -> int { return 0; }

此程序打印两次“已删除”,这是意外的。 我以为每个内联变量只有一个实例,所以我期望只有一个“已删除”。

这是编译器的错误吗?还是我做错了什么?

该代码是使用VS2017编译的。

q7967139 回答:内联变量的多次销毁

  

这是编译器的错误吗?

据我所知,是的。 GCC和Clang(以及根据评论的VS2019)仅打印一次“已删除”。

名称空间范围内的非易失性const内联变量具有外部链接。您描述的行为似乎暗示着内部链接,这是编译器的错误行为。

为完整起见,相关标准规则(摘自最新草案,我添加的重点,我添加的方括号内的强调部分):

  

[basic.link]

     

具有名称空间范围的名称如果是

的名称则具有内部链接      
      
  • ...显式声明为static; [不适用]

  •   
  • 一个非常量常量类型的非模板变量, [应用...] 除非

         
        
    • ...
    •   
    • 它是内联或已导出, [例外适用]
    •   
  •   
     

...具有名称空间范围的名称,尚未在 [apply] 上方进行内部链接,即

     
      
  • 一个变量; [应用]

  •   
  • ...

  •   
     

具有如下确定的链接:

     
      
  • 如果封闭的名称空间具有内部链接,则名称具有内部链接; [不适用]

  •   
  • 否则,如果名称的声明附加到已命名的模块上... [不适用]

  •   
  • 否则,该名称具有外部链接 [应用]

  •   
本文链接:https://www.f2er.com/3165874.html

大家都在问