2016-04-19 10 views
1
#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がVisual Studioとgccのconst参照構文の違い

error: 'const' qualifiers cannot be applied to 'float&'

を言ってエラーになります。しかし、私は

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

に関数定義を変更した場合には、gccともVisual Studioでコンパイルします。

私の質問は、これらの両方の構文が同じことを意味しますか?また、gccではなくVisual Studioでコンパイルする理由

+1

を直観的に署名が ''ボイドスワップ(CONSTフロートと、CONSTフロート&B)であるべきです。 –

+0

C++ 10はありません。おそらく98または03を意味します。 – emlai

+2

Visual Studioは間違っています(もう一度)。 –

答えて

4

float& const aは無効です。参照はconstにはできません。 constオブジェクトを参照することはできますが、それ自体はconst(それは再シール可能ではないので意味がありません)にすることはできません。

C++ 14§8.3.2/ 1:

Cv-qualified references are ill-formed except when the cv-qualifiers are introduced through the use of a typedef-name (7.1.3, 14.1) or decltype-specifier (7.1.6.2), in which case the cv-qualifiers are ignored.

decltype指定子decltypeキーワードの使用です。


のVisual C++ 2015(警告レベル4で)それについて警告を行います。

 
C:\my\forums\so\141> cl foo.cpp /Feb 
foo.cpp 
foo.cpp(3): warning C4227: anachronism used: qualifiers on reference are ignored 
foo.cpp(3): warning C4100: 'b': unreferenced formal parameter 
foo.cpp(3): warning C4100: 'a': unreferenced formal parameter 

C:\my\forums\so\141> g++ foo.cpp -Wno-unused-parameter 
foo.cpp:3:24: error: 'const' qualifiers cannot be applied to 'float&' 
void swap(float& const a, float& const b) 
         ^
foo.cpp:3:40: error: 'const' qualifiers cannot be applied to 'float&' 
void swap(float& const a, float& const b) 
             ^

C:\my\forums\so\141> _ 
関連する問題