【问题标题】:const reference syntax difference between visual studio and gccVisual Studio 和 gcc 之间的 const 参考语法差异
【发布时间】:2016-04-19 22:31:54
【问题描述】:
#include <iostream>

void swap(float& const a, float& const b)
{}

int main()
{
    std::cout << "Hello, world!\n";
}

这个简单的代码可以在 Visual Studio (vs2013) 中编译,但不能在 gcc 中编译。我已经尝试过 c++ 10 和 c++11。 gcc 给出一个错误提示

错误:“const”限定符不能应用于“float&”

但是如果我把函数定义改成

void swap(float const &a, float const &b)

它在 gcc 和 Visual Studio 中编译。

我的问题是,这两种语法的意思是一样的吗?另外,为什么它用visual studio而不是gcc编译

【问题讨论】:

  • 直觉上签名应该是void swap(const float&amp; a, const float&amp; b)
  • 没有 C++10。您的意思可能是 98 或 03。
  • Visual Studio 错了(又一次)。
  • 不知道第一个语法是否合法,但它应该没有任何效果,因为无论如何您都无法更改引用的目标。第二种语法和@πάνταῥεῖ 提出的语法有不同的含义。
  • @πάνταῥεῖ:直觉上应该是void swap( ref&lt;const float&gt; a, ref&lt;const float&gt; b ),并且可以定义一个模板ref用于此用途。这适用于模板重载解析的简单类型推导。但是auto的类型推导有点问题,规则不一样。

标签: c++ visual-studio gcc


【解决方案1】:

float&amp; const a 无效。引用不能是 const。它可以引用const 对象,但它本身不能是const(它没有意义,因为它不可重新安装)。

C++14 §8.3.2/1:

cv 限定的引用格式不正确,除非引入 cv 限定符 通过使用 typedef-name (7.1.3, 14.1) 或 decltype-specifier (7.1.6.2),在这种情况下忽略 cv 限定符。

decltype-specifierdecltype 关键字的使用。


Visual C++ 2015 确实会发出警告(警告级别 4):

C:\my\forums\so\141> cl foo.cpp /Feb foo.cpp foo.cpp(3): 警告 C4227: 使用不合时宜: 参考限定符被忽略 foo.cpp(3): 警告 C4100: 'b': 未引用的形式参数 foo.cpp(3): 警告 C4100: 'a': 未引用的形式参数 C:\my\forums\so\141> g++ foo.cpp -Wno-unused-parameter foo.cpp:3:24:错误:“const”限定符不能应用于“float&” 无效交换(float& const a,float& const b) ^ foo.cpp:3:40: 错误: 'const' 限定符不能应用于'float&' 无效交换(float& const a,float& const b) ^ C:\我的\论坛\so\141> _

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-22
    • 2015-10-12
    • 1970-01-01
    • 2019-06-19
    • 2010-11-15
    • 2017-10-09
    • 1970-01-01
    相关资源
    最近更新 更多