来自Intellisense的奇怪歧义

时间:2014-11-17 19:29:56

标签: c++ visual-c++

我有以下代码(从实际应用程序中减少了 当然):

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的情况 更接近标准,我的代码可能会停止编译 升级,更新版本更接近标准?

1 个答案:

答案 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; 。我不知道标准是否允许这样做,抱歉。