gpt4 book ai didi

c++ - Visual Studio 无法在 bool 运算的上下文中实例化强制转换(转换)运算符模板 (T=bool)

转载 作者:IT老高 更新时间:2023-10-28 23:21:33 27 4
gpt4 key购买 nike

为什么 Visual Studio 2010 和 Visual Studio 2012 无法编译这段代码?

Codepad.org、Xcode、gcc、LLVM、Clang 都没有问题,但 Visual Studio 会拉屎:

struct S {
template <class T> inline operator T () const { return T (); }
};
int main () {
// NOTE: "S()" denotes construction in these examples
struct F {
void operator() (bool) { }
static void toint (int) { }
static void tostr (char const*) { }
};
bool b1 = S (); // Okay
bool b2 (S ()); // Okay
F () (S ()); // Okay
F::toint (S ());// Okay
F::tostr (S ());// Okay

S () || false; // Error: error C2676: binary '||' : 'vf::S' does
// not define this operator or a conversion to a type
// acceptable to the predefined operator
return 0;
}

添加 explicit 关键字不会改变 gcc 或 clang 的任何事情。产生的错误信息是:

error C2676: binary '||' : 'S' does not define this operator or a
conversion to a type acceptable to the predefined operator

最佳答案

这是一个错误,至少在 C++03 中(不确定 C++11)。

根据 C++03 §13.3.1.2 中的重载解析规则,选择内置 || 运算符,因为没有用户定义的 ||运算符是为 S 定义的。

§5.15/1 说:

The || operator groups left-to-right. The operands are both implicitly converted to bool (clause 4). [...]

§12.3/2 说:

User-defined conversions are applied only where they are unambiguous (10.2, 12.3.2). [...]

§12.3/5:

User-defined conversions are used implicitly only if they are unambiguous. [...] Function overload resolution (13.3.3) selects the best conversion function to perform the conversion.

§13.3.2/3:

Second, for F to be a viable function, there shall exist for each argument an implicit conversion sequence (13.3.3.1) that converts that argument to the corresponding parameter of F.

显然 S 定义了用户定义的到 bool 的转换。内置的 || 操作符对于重载解析来说是一个可行的函数,因为它是唯一的,所以它是最好的。所以表达式是良构的。

另外值得注意的是 §4/3,它说:

An expression e can be implicitly converted to a type T if and only if the declaration “T t=e;” is well- formed, for some invented temporary variable t (8.5). [...]

所以我很好奇 Visual Studio 是否也会为语句 bool b = S(); 产生错误。

关于c++ - Visual Studio 无法在 bool 运算的上下文中实例化强制转换(转换)运算符模板 (T=bool),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13434672/

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