gpt4 book ai didi

c++ - 可变参数列表与单个模板参数 : what does the standard say?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:20:58 37 4
gpt4 key购买 nike

考虑以下代码:

#include <iostream>
#include <type_traits>

// Variadic version
template<class... Variadic>
void f(const Variadic&... variadic)
{
std::cout<<"variadic"<<std::endl;
}

// Single version
template<class Single, class = typename std::enable_if<std::is_fundamental<Single>::value>::type>
void f(const Single& single)
{
std::cout<<"single"<<std::endl;
}

// Main
int main()
{
f(); // variadic
f(42); // single : why?
f(std::string()); // variadic
f(42, 42); // variadic
return 0;
}

我不明白为什么标记为“single”的行编译良好(在 g++ 4.6.3 下)并且不会产生重载解析问题。 c++11 标准是否表示​​具有固定数量参数的模板函数优于可能具有相同签名的可变参数函数?

最佳答案

It is really quite simple (两个实例,gcc 和 clang)

template<class...T> void foo(T&&...) {std::cout << "...T\n";}
template<class T> void foo(T&&) {std::cout << "T\n";}
int main() {
foo(3);
}

重载不服用 ... 在选择是显式模板参数时似乎是首选的。

class=std::enable_if_t 不会改变这一点。

所以你的函数 f 都是候选函数,那么编译器更喜欢没有 variardics 的函数。

14.8.2.4 在部分排序期间推导模板参数 [temp.deduct.partial]

/8:

If A was transformed from a function parameter pack and P is not a parameter pack, type deduction fails. Otherwise, using the resulting types P and A, the deduction is then done as described in 14.8.2.5. If P is a function parameter pack, the type A of each remaining parameter type of the argument template is compared with the type P of the declarator-id of the function parameter pack. Each comparison deduces template arguments for subsequent positions in the template parameter packs expanded by the function parameter pack. If deduction succeeds for a given type, the type from the argument template is considered to be at least as specialized as the type from the parameter template. [ Example:

template<class... Args> void f(Args... args); // #1
template<class T1, class... Args> void f(T1 a1, Args... args); // #2
template<class T1, class T2> void f(T1 a1, T2 a2); // #3
f(); // calls #1
f(1, 2, 3); // calls #2
f(1, 2); // calls #3; non-variadic template #3 is more
// specialized than the variadic templates #1 and #

特别是 f(1,2) 示例。

当您将 std::string 作为 T 传递时,enable_if_t 子句所做的就是从考虑中移除单参数版本。

关于c++ - 可变参数列表与单个模板参数 : what does the standard say?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14180170/

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