我有以下代码(从实际应用程序中减少了 当然):
class Reader
{
class Proxy
{
Reader* myOwner;
public:
Proxy( Reader* owner ) : myOwner( owner ) {}
template <typename T>
operator T() const
{
T tmp;
myOwner->Read( &tmp );
return tmp;
}
};
public:
void Read( bool* dest );
void Read( int* dest );
void Read( std::string* dest );
// ...
Proxy Read();
};
void
testIt( Reader& r )
{
std::string s = r.Read(); // Issue on this line.
}
代码用MSC和g ++编译都很好,但Intellisense
突出显示有问题的行,并显示效果的错误消息
多个用户定义从Reader::Proxy
转换为
std::string
适用,并引用了所有或大部分构造函数
std::string
可以使用单个参数调用。
我真正的问题是:谁是对的?我的感觉是,因为我正在使用
初始化的初始化形式,编译器应该
首先将 Reader::Proxy
转换为std::string
,然后复制它。
实例化Proxy::operator std::string()
进行转换
使用单个用户定义的转换,其中作为实例化
Proxy::operator char const*()
需要两个:转换
运算符和std::string
的转换构造函数,因此
是非法的。 (如果我使用直接初始化,当然是编译器
将搜索可用于调用的所有转换
std::string
的构造函数,声明不明确。)
这是Intellisense的一个错误吗?或者是Intellisense的情况 更接近标准,我的代码可能会停止编译 升级,更新版本更接近标准?
答案 0 :(得分:2)
一般情况下,如果它在MSVC和g ++中工作但不能在Intellisense中工作,那么它可能是智能感知的错误。
那就是说,我相信你发布的代码很好。
实际上有一个MSVC警告(C4928),但它默认是关闭的:
http://msdn.microsoft.com/en-us/library/cwck4ta9.aspx
您可以在命令行或“额外编译选项”中使用/w44928
启用它。在IDE中,或使用#pragma warning(4:4928)
。
编辑:在阅读了有关该警告的MSDN文档后,看起来他们建议将代码更改为std::string s(r.Read());
,而不会发出警告。所以我猜他们的警告措辞是不是很正确(或者我们只是误读它?)他们的意思是&#34;用户定义的转换和复制初始化是在一个声明中完成的#34; 。我不知道标准是否允许这样做,抱歉。