C++ 如何在noexcept运算符中引用移动构造函数
我正在用IsNotRowMoveConstructible属性实现一个TypeInfo类。如果T类型的move构造函数标记为noexcept,我想将此参数设置为true。通过noexcept(noexcept(T())引用默认构造函数似乎是可行的,但是我还没有弄清楚如何引用move构造函数。我想解决办法是这样的:C++ 如何在noexcept运算符中引用移动构造函数,c++,exception,stl,C++,Exception,Stl,我正在用IsNotRowMoveConstructible属性实现一个TypeInfo类。如果T类型的move构造函数标记为noexcept,我想将此参数设置为true。通过noexcept(noexcept(T())引用默认构造函数似乎是可行的,但是我还没有弄清楚如何引用move构造函数。我想解决办法是这样的: template <typename T> struct TypeInfo { enum { ... IsNothrow
template <typename T>
struct TypeInfo
{
enum
{
...
IsNothrowMoveConstructible = noexcept(noexcept(T(T&&))),
...
};
};
模板
结构类型信息
{
枚举
{
...
IsNothrowMoveConstructible=noexcept(noexcept(T(T&&)),
...
};
};
我知道,我可以使用std::is_nothrow_move_可构造,但我的目标是找出在这种情况下如何使用noexcept()运算符。运算符需要一个真正的表达式。不幸的是T(T&&)
不是有效的表达式
因此,您需要实例化出现的T
,并使用std::move()
确保它使用move构造函数(如果有)。以下是概念证明:
template <typename T>
struct TypeInfo
{
bool test()
{
T t;
bool IsNothrowMoveConstructible = noexcept(T(std::move(t)));
return IsNothrowMoveConstructible;
};
};
这里有一个 您是否可以使用
noexcept(T(std::declval())
来避免默认构造T
的实例?不过,删除的移动构造函数仍然存在问题。
struct TypeInfo
{
T t;
enum {
IsNothrowMoveConstructible = noexcept(T(std::move(t)))
};
};