VC ++ 2010的另一个BUG?关于在标头中声明常量REFERENCE

时间:2010-11-15 15:09:12

标签: c++ visual-c++ reference const linkage

几行代码值得千言万语:

我有三个简单的文件:header.h,main.cpp,other.cpp

// header.h

  #pragma once

inline const int& GetConst()
{
    static int n = 0;
    return n;
}

const int& r = GetConst();

// main.cpp

  #include "header.h"

int main()
{
    return 0;
}

// other.cpp

  #include "header.h"

编译最简单的项目时,VC ++ 2010抱怨如下:

ClCompile:
  other.cpp
  main.cpp
  Generating Code...
  other.obj : error LNK2005: "int const & const r" (?r@@3ABHB) already defined in main.obj
D:\Test\Debug\bug.exe : fatal error LNK1169: one or more multiply defined symbols found

Build FAILED.

Time Elapsed 00:00:00.29
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

我确信这是VC ++ 2010的一个错误,因为有以下两个引用:

1,C ++标准说:(在n3126的第140页)

“声明为const且未显式声明为extern的对象具有内部链接。”

2,MSDN说:(在:http://msdn.microsoft.com/en-us/library/357syhfh(VS.80).aspx

“在C中,常量值默认为外部链接,因此它们只能出现在源文件中。在C ++中,常量值默认为内部链接,这允许它们出现在头文件中。

const关键字也可用于指针声明。“

1 个答案:

答案 0 :(得分:10)

您引用C ++标准的段落(C ++ 03 7.1.1 / 6):

  

声明为const且未明确声明extern的对象具有内部链接。

您尚未声明对象。您已声明了参考。引用不是对象。那就是说,3.5 / 3说:

  

具有命名空间范围的名称具有内部链接,如果它是显式声明为const的对象或引用的名称,并且既未显式声明extern也未声明具有外部链接

然而,8.3.2 / 1说:

  

符合Cv标准的参考资料不正确

因此,虽然const限定引用将具有内部链接,但是不可能对引用进行const限定。

示例程序中的引用不是const限定的,它是对const限定int的引用。