【发布时间】:2013-11-01 13:51:56
【问题描述】:
在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、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 Express 2013 上尝试过,它提供了1243548,也没有任何警告。
这是 GCC / VS 中的编译器错误,还是规范中那些尴尬的未指定行为部分之一?
【问题讨论】:
标签: c++ c++11 type-conversion variadic-templates