gpt4 book ai didi

c++ - 存在间接路由时通过强制转换

转载 作者:行者123 更新时间:2023-11-28 03:34:55 24 4
gpt4 key购买 nike

有人可以解释转换规则,以及转换何时不明确吗?我对以下情况感到有点困惑,它在 MSVC++(Visual Studio 2010)和 gcc-4.3.4 上给出了不同的答案

#include <string>

class myStr
{
std::string value;

public:
myStr(const char* val) : value(val) {}
operator const char*() const {return value.c_str();}
operator const std::string() const {return value;}
};

myStr byVal();
myStr& byRef();
const myStr& byConstRef();

int main(int, char**)
{
myStr foo("hello");
std::string test;

// All below conversions fail "ambiguous overload for 'operator='" in gcc
// Only the indicated coversions fail for MSVC++
test = foo; // MSVC++ error "'operator =' is ambiguous"
test = static_cast<std::string>(foo);

test = byVal(); // MSVC++ error "'operator =' is ambiguous"
test = static_cast<std::string>(byVal()); // MSVC++ error
// "'static_cast' : cannot convert from 'myStr' to 'std::string'"

test = byRef(); // MSVC++ error "'operator =' is ambiguous"
test = static_cast<std::string>(byRef());

test = byConstRef(); // MSVC++ error "'operator =' is ambiguous"
test = static_cast<std::string>(byConstRef());

return 0;
}

哪些规则决定了哪些转换是合法的?是否有任何兼容的方式来明确使用像 myStr 这样的类,它定义了对 const char*const std::string 的转换?

最佳答案

隐式转换都是不明确的,因为 std::string 重载了同时采用 const std::string&const char* 的赋值运算符>。这意味着您的两个转换运算符都是同样好的选择,因此存在歧义:

myStr -> std::string -> operator=(const std::string&)
myStr -> const char* -> operator=(const char*)

static_cast 的歧义是因为您正在使用强制转换来创建一个临时的 std::string 对象。从 std::stringconst char* 创建它同样有效,因此再次考虑您的两个转换运算符。

myStr -> std::string -> static_cast<std::string>(std::string)
myStr -> const char* -> static_cast<std::string>(const char*)

您可以通过转换为引用来打破歧义:

test = static_cast<const std::string&>(foo);

这仍然会创建一个临时对象,因为转换运算符返回一个对象。但是,该转换现在是隐式的,因此不能涉及多个用户定义的转换;因此,它只能通过您的 operator std::string() 完成,并且没有歧义。

myStr -> std::string -> static_cast<const std::string&>(std::string)
myStr -> const char* -> std::string -> static_cast<const std::string&>(std::string)
^^ ^^ two implicit user-defined conversions - not allowed

您还可以考虑更改转换运算符以返回 const 引用,从而避免不必要的临时变量。

关于c++ - 存在间接路由时通过强制转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11223433/

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