0

数行のコードは1000語の価値があります。

私は3つの単純なファイルを持っています: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 ==========

次の2つの参照があるため、これはVC++2010のバグであると確信しています。

1、C ++標準によると:(n3126の140ページ)

「constと宣言され、externと明示的に宣言されていないオブジェクトには、内部リンクがあります。」

2、MSDNによると:(http://msdn.microsoft.com/en-us/library/357syhfh (VS.80).aspx )

「Cでは、定数値はデフォルトで外部リンケージに設定されるため、ソースファイルにのみ表示されます。C++では、定数値はデフォルトで内部リンケージに設定されるため、ヘッダーファイルに表示されます。

constキーワードは、ポインタ宣言でも使用できます。」

4

1 に答える 1

10

C ++標準から引用する段落は次のとおりです(C ++ 03 7.1.1/6):

宣言されたオブジェクトconstと明示的に宣言されexternていないオブジェクトには、内部リンクがあります。

オブジェクトを宣言していません。参照を宣言しました。参照はオブジェクトではありません。そうは言っても、3.5/3は次のように述べています。

名前空間スコープを持つ名前は、constとして明示的に宣言され、外部リンケージを持つように明示的に宣言されexternておらず、以前に宣言されていないオブジェクトまたは参照の名前である場合、内部リンケージを持ちます

ただし、8.3.2/1は次のように述べています。

Cv修飾された参照は形式が正しくありません

したがって、const修飾された参照には内部リンケージがありますが、参照をconst修飾することはできません。

サンプルプログラムの参照はconst-qualifiedではなく、const-qualifiedへの参照intです。

于 2010-11-15T15:11:34.670 に答える