2011-07-02 11 views
3
autoに関連するエラー以下

が、理解しやすいです:同じ "auto"宣言で基本クラスが自動的に推論されないのはなぜですか?

auto i = int(), d = double(); // error: inconsistent deduction for ‘auto’ 

しかし、同じエラーで被害を受けている以下の理由:

struct B {}; 
struct D : B {}; 

const auto &b1 = B(), &b2 = D(); // error: inconsistent deduction for ‘auto’ 

b1がすでにconst B&に推定されることが知られた、することはできませんコンパイラはb2const B&にしようとしていますか? (b2const B&に導かれた場合、どのような危険が発生する可能性がありますか?)

答えて

6

危険性は予期しない結果になります... Dを作成すると、結果としてDが得られます。また、キャストが関与しているという事実もあります。それは「安全な」キャストですが、キャストなしのキャストです。最初の例でも同じ議論ができます... doubleは簡単に変換することができ、iの結果に基づいて型を決定しているので、なぜコンパイラはdintにしませんか?または、2つの兄弟授業を持っている場合はどちらですか...どちらも共通の基盤に解決する必要がありますか?

このコードをコンパイルする場合は、結果を常に明示的にキャストして両方の式が同じ型になるようにD()をキャストすることができます。

と言語の弁護士ビット用

[decl.spec.auto]/7:

If the list of declarators contains more than one declarator, the type of each declared variable is determined as described above. If the type deduced for the template parameter U is not the same in each deduction, the program is ill-formed.

0

号コンパイラはその自由を持っていません。同じ宣言に含まれるすべてのauto変数は、同じ型でなければなりません。

答えてください。曖昧関与がある場合、コンパイラは、自動的に適切な機能を推定するために、その自由を持っていない

void f(int); 
void f(float); 

f(10.5); 

ので:なぜこれのfloatバージョンを呼び出すコンパイラはできません。

関連する問題