考虑下面的函数bar,其参数具有从重载调用初始化的默认值foo:
#include <iostream>
int foo(int x)
{
std::cout << "foo(int)" << std::endl;
return 0;
}
template<typename T>
void bar(T a, int x = foo(T(0))) {}
double foo(double x)
{
std::cout << "foo(double)" << std::endl;
return 0;
}
int main()
{
bar<int>(1);
bar<double>(1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这个程序输出
foo(int)
foo(double)
Run Code Online (Sandbox Code Playgroud)
对应于foo在bar实例化时可见的两个重载.
相反,当编译时g++-4.6,输出是
$ g++-4.6 -std=c++0x test.cpp; ./a.out
foo(int)
foo(int)
Run Code Online (Sandbox Code Playgroud)
在实现与正常重载分辨率不同的默认参数值时是否考虑了过载集?这种情况是在ISO C++标准中描述的吗?