gpt4 book ai didi

c++ - 来自 Intellisense 的奇怪歧义

转载 作者:行者123 更新时间:2023-11-30 03:59:18 25 4
gpt4 key购买 nike

我得到了以下代码(从实际应用中减去的,类(class)):

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::Proxystd::string 应用并引用所有或大部分的构造函数std::string 可以用一个参数调用。

我真正的问题是:谁是对的?我的感觉是因为我正在使用初始化的复制初始化形式,编译器应该首先转换 Reader::Proxystd::string,然后复制它。并且实例化 Proxy::operator std::string() 进行转换使用单个用户定义的转换,其中作为实例化Proxy::operator char const*() 需要两个:转换运算符和 std::string 的转换构造函数,因此是非法的。 (当然,如果我使用直接初始化,编译器将搜索所有可用于调用的转化std::string 的构造函数,并且该语句会产生歧义。)

那么这是 Intellisense 中的错误吗?或者是 Intellisense 的情况更接近标准,并且当我们升级,新版本更符合标准?

最佳答案

通常,如果它在 MSVC 和 g++ 中工作但在 Intellisense 中不工作,则可能是 Intellisense 出了问题。

也就是说,我相信您发布的代码没有问题。

实际上有一个针对此的 MSVC 警告 (C4928),尽管默认情况下它是关闭的:

http://msdn.microsoft.com/en-us/library/cwck4ta9.aspx

您可以通过在命令行或 IDE 的“额外编译选项”中使用 /w44928 来启用它,或者通过使用 #pragma warning(4:4928).

编辑:阅读了有关该警告的 MSDN 文档后,他们似乎建议将您的代码更改为 std::string s(r.Read()); 将在没有警告的情况下工作.所以我猜他们对警告的措辞不太正确(或者我们只是误读了它?),他们真正的意思是“用户定义的转换和复制初始化在一条语句中完成”。我不知道标准是否允许这样做,抱歉。

关于c++ - 来自 Intellisense 的奇怪歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26980436/

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