考虑下面的函数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;
}
我希望这个程序能够输出
foo(int)
foo(double)
对应于'实例化foo
时可见的 ' 的两个重载。bar
相反,当用 编译时g++-4.6
,输出是
$ g++-4.6 -std=c++0x test.cpp; ./a.out
foo(int)
foo(int)
在实现与正常重载解决方案不同的默认参数值时是否考虑了重载集?ISO C++ 标准中是否描述了这种情况?