gpt4 book ai didi

c++ - 可变参数模板和省略号有什么区别?

转载 作者:行者123 更新时间:2023-12-01 09:04:25 25 4
gpt4 key购买 nike

我知道标题没有多大意义,但代码会解释我的问题。

template<typename T>
void foo(T...) {std::cout << 'A';}

template<typename... Ts>
void foo(Ts...) {std::cout << 'B';}

int main(){
foo(1);
foo(1,2);
}

在继续阅读之前尝试猜测该程序的输出:

所以输出是 AB
谁能解释为什么对于 1 个参数函数优先考虑省略号,而对于可变参数模板的 2 个参数?

最佳答案

第一次重载是什么?

根据 [dcl.fct]

Where syntactically correct and where “...” is not part of an abstract-declarator, “, ...” is synonymous with “...”.



因此,这使得第一个重载成为可变参数函数(也恰好是模板化的),它等效于:
template<typename T>
void foo(T, ...) {std::cout << 'A';}

(注意, cppreference 页面包含一个示例,在第一个参数和可变参数之间省略了逗号。)

为什么我们会看到特定的输出?

当您传递两个参数时,编译器更喜欢另一个重载,因为在重载解析期间,在对可行重载进行排序时,省略号转换序列总是排在最后。 ( [over.ics.rank])

当传递单个参数时,编译器更喜欢第一次重载,因为简单地说,省略号不匹配(因为没有什么可以匹配)。这可以防止该函数被视为省略号转换序列。然后进行正常函数模板排序,并确定该函数比可变参数函数更专业( [temp.deduct.partial] )

关于c++ - 可变参数模板和省略号有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61954228/

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