最も厄介な解析: C 11 の曖昧さを解明する
C 11 の「最も厄介な解析」の曖昧さは、ユニフォーム初期化子を使用するときに現れます。次のコード スニペットに示されているように:
#include
class Timer
{
public:
Timer() {}
};
int main()
{
auto dv = Timer(); // Ambiguity: Object or function call?
int time_keeper(Timer()); // Ambiguity: Pointer or call?
return 0;
}
最初の式を理解する (auto dv = Timer())
最初の式の auto キーワードは、dv の型がイニシャライザから推論されることを意味します。等号 (=) の右側。イニシャライザは、引数なしで Timer コンストラクターを呼び出し、Timer オブジェクトを返します。したがって、 dv は Timer 型のオブジェクトです。
2 番目の式を理解する (int time_keeper(Timer()))
2 番目の式では、次の理由によりあいまいさが生じます。コンパイラは、Timer() が関数呼び出しであるか、参照によって渡される Timer 型のオブジェクトであるかを判断できません。
ただし、関数は引数として渡されるとポインターに減衰するため、time_keeper の真の型は int(Timer(*)()) となり、ポインターを優先して曖昧さが解決されます。 -関数の解釈。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3