使用默认参数消除函数的歧义
disambiguate function with default parameter
我一直认为默认参数是重载的语法糖。
但似乎它们只是粘在一个函数(类型)的顶部——没有提供任何函数(类型)的函数。
有没有充分的理由会这样?
void foo(int i);// void (*)(int)
void foo();// void (*)()
void bar(int i = false);// void (*)(int)
int main() {
return static_cast<void(*)()>(&foo) // works
&& static_cast<void(*)()>(&bar);// doesn’t work
}
他们肯定受到不同的对待。
void foo(int i);// void (*)(int)
void foo();// void (*)()
这些调用在链接时解析,链接器会将它们链接到不同的函数,因为它们是不同的函数。
void bar(int i = false);// void (*)(int)
它在编译时解决,如果您不提供参数,编译器将添加额外的参数,并且所有调用都将链接到同一函数。
由于是编译器添加额外的参数,因此编译器必须知道默认参数,因此它在编译时必须可见。
示例代码:
% cat t.cpp
void foo(int i);// void (*)(int)
void foo();// void (*)()
void bar(int i = false);// void (*)(int)
int main() {
foo(0);
foo();
bar(0);
bar();
}
编译结果:
% objdump -C -r t.o
t.o: file format elf64-x86-64
RELOCATION RECORDS FOR [.text]:
OFFSET TYPE VALUE
000000000000000a R_X86_64_PC32 foo(int)-0x0000000000000004
000000000000000f R_X86_64_PC32 foo()-0x0000000000000004
0000000000000019 R_X86_64_PC32 bar(int)-0x0000000000000004
0000000000000023 R_X86_64_PC32 bar(int)-0x0000000000000004
RELOCATION RECORDS FOR [.eh_frame]:
OFFSET TYPE VALUE
0000000000000020 R_X86_64_PC32 .text
有 foo() 和 foo(int),但只有 bar(int) 没有 bar()。
相关文章:
- 我知道函数调用中存在歧义.有没有办法调用foo()函数
- 数组初始值设定项的构造函数歧义
- 为什么下面带有非常量转换函数的代码没有歧义?
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 使用 bool 和 const char 重载的 C++ 函数会在没有警告的情况下产生歧义 (MSVC2012)
- C++SFINAE enable_if_t成员函数,如何消除歧义?
- 当存在覆盖歧义函数时,代码如何运行?
- 如何区分宏函数和函数函数而没有任何歧义?
- 模板与常规函数歧义 - UB?
- C++ 类的构造函数和函数调用运算符 () 重载之间的歧义
- 如何解决传递给boost线程的函数中的歧义
- 如何让编译器知道要调用函数的哪个重载以避免歧义?
- 关于模板化函数上传递的右值引用和传递的参数的歧义
- C++ 显式多参数构造函数歧义
- 减少模板化变差函数歧义的最佳方法是什么
- 重载模板化函数歧义问题
- 为什么编译器在这里抱怨函数歧义
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 虚函数歧义求解
- 转换运算符重载 - 函数歧义