gpt4 book ai didi

c++ - 使用默认参数消除函数歧义

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:14:32 33 4
gpt4 key购买 nike

我一直认为默认参数是重载的语法糖。
但它们似乎只是粘在一个函数(类型)之上——一个没有提供它们的函数。
出现这种情况有充分的理由吗?

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()。

关于c++ - 使用默认参数消除函数歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35591830/

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