1

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 3foo 2foo 3foo 1124354812355248foo 3foo 3foo 2foo 2foo 1foofoo 2foo 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 つですか?

4

2 に答える 2

1

foo 2は の範囲内にないため、呼び出すfoo 3ことができません。foo 3foo 2

于 2013-11-01T14:01:30.713 に答える