Problems with enable_if SFINAE
Problems with enable_if SFINAE
我在编写的程序中遇到了一些莫名其妙的SFINAE问题,所以我把它归结为一个独立的示例程序:
#include <type_traits>
struct Base { };
struct Derived : public Base { };
template<typename T>
struct From { };
template<typename T>
struct To {
template<typename U>
To(const From<U>& other) {
static_assert(std::is_convertible<U*, T*>::value, "error");
}
};
int main() {
From<Derived> a;
To<Base> b = a;
}
此程序编译时没有出现错误或警告。然而,这:
#include <type_traits>
struct Base { };
struct Derived : public Base { };
template<typename T>
struct From { };
template<typename T>
struct To {
template<typename U>
To(const From<typename std::enable_if<true, U>::type>& other) {
// this ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
static_assert(std::is_convertible<U*, T*>::value, "error");
}
};
int main() {
From<Derived> a;
To<Base> b = a;
}
给出以下错误:
test.cpp:在函数
int main()
:中test.cpp:22:18:错误:从
From<Base>
转换为非标量类型To<Derived>
请求
这是因为我认为替换失败了,并且看不到构造函数。
我做错了SFINAE,还是这是一个编译器错误?我在Windows上使用的是ruenvb的GCC 4.7.1(如果std=c++11
有区别的话)。
我会使用默认的模板参数,这样就可以推导出参数:
#include <type_traits>
struct Base { };
struct Derived : public Base { };
template<typename T>
struct From { };
template<typename T>
struct To {
template<typename U, class = typename std::enable_if<true, U>::type>
To(const From<U>& other) {
// this ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
static_assert(std::is_convertible<U*, T*>::value, "error");
}
};
int main() {
From<Base> a;
To<Derived> b = a;
}
请注意,这会导致static_assert
失败,因为您使用的是相反的std::is_convertible
。应该是:
static_assert(std::is_convertible<T*, U*>::value, "error");
在您的示例中,无法推导出模板类型U
。在我的代码中,它可以被推导出来,因为它被用作构造函数中other
参数的模板参数。在您的代码中,编译器看到一个std::enable_if<true, U>::type
,但无法推断出该U
类型是什么。该enable_if
的结果被用作From
的模板参数这一事实根本没有帮助,因为在此之前需要推断出U
。
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- 为什么使用SFINAE而不是函数重载
- 如何使用模板函数的函数签名进行SFINAE
- 数据成员SFINAE的C++17测试:gcc vs clang
- 使用在用于SFINAE的void_t中具有参数的方法
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 禁用具有"if constexpr"和 SFINAE 的分支
- if constexpr vs sfinae
- 在 if-else 块中实现类似 SFINAE 的效果
- SFINAE with boost enable if
- "constexpr if"被认为是SFINAE吗?