gpt4 book ai didi

c++ - 移动构造函数在类中的位置/顺序很重要吗?模板转换运算符结合移动构造函数

转载 作者:太空狗 更新时间:2023-10-29 20:28:44 25 4
gpt4 key购买 nike

这看起来像是一个编译器错误,但案例太简单了,我有点怀疑,所以我正在寻找确认。可使用 VS2010 和 VS2012 重现。下面的示例无法编译。给出此错误:

Error 1 error C2440: 'type cast' : cannot convert from 'ConvertibleToAny' to 'OtherType<_Ty>' test.cpp 40

如果将移动构造函数 OtherType(ThisType &&) 的位置移动到构造函数 OtherType( int ) 上方,它会突然编译。

#include "stdafx.h"
#include <string>

using namespace std;

template<class _Ty>
struct OtherType
{
typedef OtherType<_Ty> ThisType;

OtherType()
{
}

OtherType( int )
{
}

// The move constructor
OtherType(ThisType && )
{
}
};

struct ConvertibleToAny
{
template <class AnyType>
operator AnyType()
{
return AnyType();
}
};

int _tmain(int argc, _TCHAR* argv[])
{

(OtherType<wstring>) ConvertibleToAny();

return 0;
}

这是错误还是预期的行为?如果是预期的,请引用 C++11 规范中的相关段落。我已经将此作为错误发布在 Microsoft Connect 上,click here to open it .

最佳答案

你的表情

(OtherType<wstring>) ConvertibleToAny()

是从用户定义的临时类型到用户定义类型的一元显式转换 (5.4),根据 5.4:4 解释为 static_cast:

static_cast<OtherType<wstring>>(ConvertibleToAny())

根据 5.2.9:4 具有初始化临时变量 t 的有效性:

OtherType<wstring> t(ConvertibleToAny())

这是直接初始化 (8.5:15),因此 (8.5:16) OtherType 的所有单参数构造函数都按照规则参与重载决议在 13.3.1.3 中。

在 13.3:2 之后,int 和 move 构造函数都可用并且按照 13.3.2 是可行的,因此对于单个参数,我们有两个可能的隐式转换序列 (13.3.3.1):

ConvertibleToAny [temporary] -> int
ConvertibleToAny [temporary] -> OtherType<wstring> &&

在 13.3.3.1.2 之后,这些序列之间没有顺序,因此没有最佳可行函数,重载解析失败 (13.3:3),并且程序格式错误。


如果转换函数 (12.3.2) 为显式 (12.3.2:2),则仅考虑直接初始化。尽管隐式转换序列 (13.3.3.1) 是隐式转换 (4:3),因此涉及复制初始化,但 12.3.2:2 示例中标准的意图显然是在这种情况下应考虑显式转换函数;因此,重载决议似乎再次失败。

关于c++ - 移动构造函数在类中的位置/顺序很重要吗?模板转换运算符结合移动构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12364806/

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