:
私は「最も厄介な解析」あいまいさを示す必要があり、次のコードを理解していない
auto dv = Timer();
あなたはdv
と呼ばれるタイプTimer
の対象であることを持っています(=
符号の右側の式)からコピー初期化されています。
auto
を使用して変数を宣言する場合、その変数の型は初期化する式の型と同じです。ここではcv修飾子と参照は考慮しません。
dv
を初期化する式のタイプはTimer
であり、dv
のタイプはTimer
です。ここで
:
int time_keeper(Timer());
あなたはint
を返し、その入力としてTimer
を返し、引数をとらない関数へのポインタかかりtime_keeper
という関数を宣言します。
なぜ、引数がTimer (*)()
ではないのですか?
関数は引数として渡されたときにポインタに崩壊するので、タイプtime_keeper
は実際にはint(Timer(*)())
です。
自分を納得させるには、この小さなプログラムをコンパイルしてみてください:
ここ
#include <type_traits>
struct Timer { };
int main()
{
int time_keeper(Timer());
static_assert(
std::is_same<
decltype(time_keeper),
int(Timer(*)())
>::value,
"This should not fire!");
}
がlive exampleです。
2番目の行がMVPを呼び出すAFAIK、最初の行はMVPを呼び出さない。 –
私はそれを知っていますが、コードに含まれる型と混同しています –