gpt4 book ai didi

c++ - 解析分配给默认参数值的重载函数时考虑了哪些函数集?

转载 作者:IT老高 更新时间:2023-10-28 23:01:00 27 4
gpt4 key购买 nike

考虑下面的函数 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++ 标准中是否描述了这种情况?

最佳答案

该程序建议所考虑的函数集遵循正常的重载解决规则:

#include <iostream>

struct type1 {};
struct type2 {};

int foo(type1 x)
{
std::cout << "foo(type1)" << std::endl;
return 0;
}

template<typename T>
void bar(int x = foo(T())) {}

int foo(type2 x)
{
std::cout << "foo(type2)" << std::endl;
return 0;
}

int main()
{
bar<type1>();
bar<type2>();
return 0;
}

当使用g++-4.6编译时,该程序输出:

$ g++ test_2.cpp ; ./a.out 
foo(type1)
foo(type2)

换句话说,foo 是在 bar 被实例化时通过 ADL 解析的。

OP 代码的行为似乎是 ADL 不适用于 intdouble 等原语,因此唯一考虑的重载是之前声明的重载foo 的调用。奇怪的 MSVC 行为似乎是非标准的。

关于c++ - 解析分配给默认参数值的重载函数时考虑了哪些函数集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13484308/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com