Еще одна ошибка VC ++ 2010? Об объявлении константы REFERENCE в заголовке - PullRequest
0 голосов
/ 15 ноября 2010

Несколько строк кода стоят тысячи слов:

У меня есть три простых файла: 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 ++ гласит: (встр. 140 из n3126)

"Объекты, объявленные const и явно не объявленные extern, имеют внутреннюю связь."

2, MSDN сообщает: (at: http://msdn.microsoft.com/en-us/library/357syhfh(VS.80).aspx)

"В C значения констант по умолчанию имеют внешнюю связь, поэтому они могут появляться только в исходных файлах. В C ++ значения констант по умолчанию имеют внутреннюю связь, что позволяет им появляться в заголовочных файлах.

Ключевое слово const также может бытьиспользуется в объявлениях указателей. "

1 Ответ

10 голосов
/ 15 ноября 2010

Абзац, который вы цитируете из Стандарта C ++, читается (C ++ 03 7.1.1 / 6):

Объекты, объявленные const и не объявленные явно extern, имеют внутреннюю связь.

Вы не объявили объект.Вы объявили ссылку.Ссылка не является объектом.Тем не менее, 3.5 / 3 говорит:

Имя, имеющее область пространства имен, имеет внутреннюю связь, если это имя объекта или ссылки, которые явно объявлены как const и ни явно не объявлены extern, ни ранее объявленныеиметь внешнюю связь

Однако 8.3.2 / 1 гласит:

Cv-квалифицированные ссылки плохо сформированы

Итак,в то время как ссылка с квалификацией const будет иметь внутреннюю связь, невозможно квалифицировать ссылку с константой.

Ссылка в вашей программе примера не является константной, это ссылка на константную int.

...