gpt4 book ai didi

c++ - 再次关于 enable_if_t 中的 C++ SFINAE

转载 作者:行者123 更新时间:2023-11-28 04:28:38 26 4
gpt4 key购买 nike

我想弄清楚为什么 SFINAE 不能使用直接模板参数初始化?

当我在此处声明另一个模板参数时,它以这种形式工作:

#include <iostream>

template <bool B, class T = void>
class enable_if {};

template <class T>
struct enable_if<true, T> { typedef T type; };

template <bool B, class T>
using enable_if_t = typename enable_if<B,T>::type;

template< typename T >
struct Y {

public:
template< typename U = T >
enable_if_t<true, U>
foo() {
return 111;
}

template< typename U = T >
enable_if_t<false, U>
foo() {
return 222;
}
};

int main() {
Y< double > y;
std::cout << y.foo() << std::endl;
}

(打印出 111)

但是如果我重构这个语法,编译器会报错:

#include <iostream>

template <bool B, class T = void>
class enable_if {};

template <class T>
struct enable_if<true, T> {
typedef T type;
};

template <bool B, class T>
using enable_if_t = typename enable_if<B,T>::type;

template< typename T >
struct Y {
template< typename U = enable_if_t<true, T> >
U
foo() {
return 11;
}

template< typename U = enable_if_t<false, T> >
U
foo() {
return 12;
}
};

int main() {
Y< double > y;
std::cout << y.foo() << std::endl;
}

“Class member cannot be redeclared”我假设第二个实例无效并且应该被 SFINAE 排除?

为什么我不能这样声明 foo():

enable_if_t<true, T> foo() { return 11; } 
enable_if_t<false, T> foo() { return 12; }

仅基于类模板的 T 参数?第二个 enable_if_t 不应该有效并且 foo() 的实例应该被丢弃,对吧?

最佳答案

在第二种情况下,您声明了两个类方法:

template<typename U> U foo();

你不能有两个具有相同签名和名称的模板类方法,就像你不能声明两个具有相同签名和名称的非模板类方法一样:

int bar();

int bar();

您的两个模板类方法具有不同的模板参数默认值,但这并不重要。模板参数默认值不被视为签名的一部分。 SFINAE 在这里没有发挥作用。 SFINAE 是模板替换 发生时发生的事情,“S”部分,而不是声明。

关于c++ - 再次关于 enable_if_t 中的 C++ SFINAE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53594431/

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