2012 ACCU C++ Pub quizの質問 15 で、私はその結果に困惑しています。
#include <iostream>
template<typename T> void P(T x) { std::cout << x; }
void foo(char a) { // foo 1
P(3);
P(a);
}
template <typename... A> // foo 2
void foo(int a, A... args) {
foo(args...);
P(a);
}
template <typename... A>
void foo(char a, A... args) { // foo 3
P(a);
foo(args...);
}
int main()
{
foo('1','2',48,'4','5');
}
、 、、 、を呼び出しfoo 3
、の出力を与えると推論しました。実際の出力はであり、デバッガーで次のように確認されました。4 番目の呼び出しが にならない理由がわかりません。foo 3
foo 2
foo 3
foo 1
1243548
12355248
foo 3
foo 3
foo 2
foo 2
foo 1
foo
foo 2
foo 3
参考までに、gcc 4.8.1g++ -g -Wall -std=c++11 -Weffc++ -Wextra -O0 /tmp/foo.cpp -o /tmp/foo
でコンパイルしましたが、警告はまったく表示されませんでした。
編集: Visual Studio Express 2013 で試してみたところ、1243548
警告も表示されません。
これは GCC / VS のコンパイラのバグですか、それとも仕様の不明確な動作部分の 1 つですか?