在2012 ACCU C++ Pub quiz的问题15中,我被结果难倒了。Variadic模板和类型扣除问题
#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
,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.1 g++ -g -Wall -std=c++11 -Weffc++ -Wextra -O0 /tmp/foo.cpp -o /tmp/foo
进行编译,根本没有任何警告。
编辑:我刚在Visual Studio速成2013年,它给1243548
,也没有警告。
这是GCC/VS中的编译器错误,还是规范中那些尴尬的未指定行为部分之一?
根据3.3节的标准,这正是“范围”。 –
所以这是Visual Studio中的错误? –
是的,Visual Studio编译器以不符合标准的方式实现模板。 –