gpt4 book ai didi

c++ - VC++ 2010的另一个BUG?关于在 header 中声明常量 REFERENCE

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:16 25 4
gpt4 key购买 nike

几行代码顶一千字:

我有三个简单的文件: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 关键字也可以用在指针声明中。"

最佳答案

你从 C++ 标准中引用的段落是这样的 (C++03 7.1.1/6):

Objects declared const and not explicitly declared extern have internal linkage.

您还没有声明一个对象。你已经声明了一个引用。引用不是对象。也就是说,3.5/3 表示:

A name having namespace scope has internal linkage if it is the name of an object or reference that is explicitly declared const and neither explicitly declared extern nor previously declared to have external linkage

然而,8.3.2/1 说:

Cv-qualified references are ill-formed

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

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

关于c++ - VC++ 2010的另一个BUG?关于在 header 中声明常量 REFERENCE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4185687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com