在C ++中,使用运算符强制转换可能会导致代码读者混淆,因为调用函数调用并不明显。话虽如此,我已经看到它的使用被劝阻了。
但是,在什么情况下使用操作员演员是合适的并且具有超出可能导致的任何可能混淆的价值?
答案 0 :(得分:1)
当转换是自然的并且没有副作用时,它可能是有用的。没有人会认为从int
到double
的自动转换是不合适的,例如,即使你能提出一个令人困惑的角落案例(我不确定是否有人可以)
我发现微软CString
到const char *
的转换非常方便,即使我知道其他人也不同意。我不介意在std::string
中看到类似的功能。
答案 1 :(得分:1)
运算符强制转换在包装器对象的C ++习语中非常有用。例如,假设您有一些字符串类的copy-on-write实现。您希望您的用户能够自然地为其编制索引,例如
const String s = "abc";
assert(s[0] == 'a');
// given
char String::operator[](int) const
到目前为止,你认为这会奏效。然而,当有人想要修改你的字符串时会发生什么?也许这会起作用吗?
String s = "abc";
s[0] = 'z';
assert(s[0] == 'z');
// given
char & String::operator[](int)
但是这个实现提供了对非const字符的引用。所以有人总是可以使用该引用来修改字符串。因此,在它发布引用之前,它必须在内部执行字符串的副本,以便不修改其他字符串。因此,在不强制复制的情况下,不能在非const字符串上使用operator[]
。怎么办?
您可以返回包含以下接口的包装器对象,而不是返回字符引用:
class CharRef { 上市: operator char()const; CharRef&运算符=(炭); };
char()
转换运算符只返回存储在字符串中的字符的副本。但是,当您分配给包装器时,如果引用计数大于1,operator=(char)
将强制字符串执行内部副本,而是修改该副本。