auto
C++ 11以降で型を解決する方法を誤解する必要があります。 int
(int 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
)。コードを再生してさまざまなエラーメッセージが表示された後、auto
はlong 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]
結果を理解していません。
'a'は参照ではありません。単純な' long'です。 – LogicStuff
^^^^^^ [はい、それはちょうど '長い'](http://ideone.com/lGpcWt) – StoryTeller
なぜそれが長いのかわからない場合、その理由はタイププロモーションです。そして、あなたは[この答えを読む]べきである(http://stackoverflow.com/questions/6770258/how-do-promotion-rules-work-when-the-signedness-on-either-side-of-a-binary -opera) – StoryTeller