C++ 如何在noexcept运算符中引用移动构造函数

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

我正在用IsNotRowMoveConstructible属性实现一个TypeInfo类。如果T类型的move构造函数标记为noexcept,我想将此参数设置为true。通过noexcept(noexcept(T())引用默认构造函数似乎是可行的,但是我还没有弄清楚如何引用move构造函数。我想解决办法是这样的:

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)))
    }; 
};