【发布时间】:2021-08-24 22:14:03
【问题描述】:
我有一个不可移动的结构和一个模板化的类,我希望在其中拥有一个仅在类型可移动时才存在的函数(使用 enable_if 和 type_traits)。但是,似乎尽管 std::is_move_constructible_v 返回 false,但该函数仍然存在并且可以执行。但是,当我将代码更改为使用 requires 子句时,一切都按预期工作。 这是为什么呢?
#include<bits/stdc++.h>
class NonMovable{
public:
NonMovable(const NonMovable&) = default;
NonMovable(NonMovable&&) = delete;
NonMovable& operator =(const NonMovable&) = default;
NonMovable& operator = (NonMovable&&) = delete;
NonMovable() = default;
};
template<typename T>
struct Foo{
template<typename = std::enable_if<std::is_move_constructible_v<T>,bool>>
void foo(T&& t){ // allowed
// ...
}
};
template<typename T>
struct Foo{
void foo(T&& t) requires std::is_move_constructible_v<T>{ // not allowed
// ...
}
};
int main(){
NonMovable nonMovable;
Foo<NonMovable> x;
std::cout << std::is_move_constructible_v<NonMovable> << "\n"; // 0
x.foo(std::move(nonMovable));
}
【问题讨论】:
-
看起来你的意思是
enable_if_t,而不是enable_if。 -
您是否只想禁用该构造函数,而不是整个类实例?
-
@NathanPierson 谢谢你,就是这样
-
@TedLyngmo 的意图是禁用该功能。我设法用
requires子句做到了这一点。 'enable_if_t` 禁用整个班级。 -
要使用 SFINAE 禁用 只是 成员函数而不是整个类,请查看 this question。
标签: c++ templates typetraits enable-if