2016-12-14 8 views
2

auto C++ 11以降で型を解決する方法を誤解する必要があります。 intint a = ir/L;)は罰金コンパイルとautoを置き換える、しかしC++ 11 int型とlong型の算術演算からの自動型の差し引き

test.cpp: In function 'int main()': 

test.cpp:12:10: error: invalid initialization of non-const reference 
of type ‘int&’ from an rvalue of type ‘int’ 
    foo(a); 
     ^

test.cpp:1:6: note: initializing argument 1 of ‘void foo(int&)’ 
void foo(int& x) 
     ^~~ 

foo()への呼び出しの前に予想される結果(a == 0を与える:

void foo(int& x) 
{ 
    ++x; 
} 

int main() 
{ 
    int i = 2; 
    int& ir = i; 
    long L = 5; 
    auto a = ir/L; 
    foo(a); 

    return 0; 
} 

これは、コンパイラエラーになり:私は、次のコードを持っています、およびa == 1)。コードを再生してさまざまなエラーメッセージが表示された後、autolong int&と推測されます。 void bar(int x)void bar(const int& x)の関数を定義すると、エラーメッセージ:call of overloaded ‘bar(long int&)’ is ambiguousが発生します。コメントから

訂正:

私はできない右辺値でauto x = [int&]/[long]結果ながら、非const参照によって渡すことができる左辺値でどのようにauto x = [int&]/[int]結果を理解していません。

+4

'a'は参照ではありません。単純な' long'です。 – LogicStuff

+3

^^^^^^ [はい、それはちょうど '長い'](http://ideone.com/lGpcWt) – StoryTeller

+2

なぜそれが長いのかわからない場合、その理由はタイププロモーションです。そして、あなたは[この答えを読む]べきである(http://stackoverflow.com/questions/6770258/how-do-promotion-rules-work-when-the-signedness-on-either-side-of-a-binary -opera) – StoryTeller

答えて

4

ir/Lの結果はlongです。 arithmetic operatorの場合、バイナリ演算子が異なる型を持つ場合、生成される結果は共通型になります。 intlongの間では、longとなります。

従ってauto a = ir/L;のタイプは、alongです。 lvalue参照を非constに異なる型でバインドできないため、foo(int&)に渡すことはできません。

一方、Lのタイプはintで与えられ、その後、auto a = ir/L;ため、aのタイプはintになり、その後、すべてが正常です。あなたはlongfoo(int&)に、まずコンパイラは、一時的な(つまり、右辺値)がある、intに変換しようとするとにバインドすることはできませんパス「エラーの右辺値の部分」について

、左辺値は非const値を参照します。

longは暗黙的にintに変換することができ、一時はそうbar(int x)bar(const int&)罰金の両方にlong変数を渡し、CONSTへの参照を左辺値にバインドすることができます。

はところで:あなたはint a = ir/L;書くとき、タイプlongの結果は、暗黙的にintに変換されます。したがって、intが得られます。foo(int&)に渡すと問題ありません。

+0

私は参照してください。私は一時的な値(エラーメッセージのrvalue)を作成する型変換を考えたことはありません。これは完璧な意味合いがあります。ありがとう。 –

1

autoを使用したことは関係ありません。

aは、引数昇格の規則のためにlongタイプです。

fooを参照によってパラメータがかかるためint&は(彼らは同じ大きさであり、同じ補数表現を持っていても)longタイプに特異的に結合することができないので、コンパイルが失敗します。

+0

'int const&'は一時的に狭められた 'int'に非常によくバインドします。 – StoryTeller

+0

@StoryTeller:まったく! – Bathsheba

関連する問題