作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下示例在 godbolt 上编译良好与 -std=c++17
使用 clang,但使用 msvc 和 gcc 失败:
struct Foo
{
};
struct Bar
{
explicit operator Foo() // w/o explicit qualification all are happy
{
return Foo();
}
};
int main()
{
Bar b;
const Foo& foo = static_cast<const Foo&>(b); // only clang happy with this
const Foo& foo2 = static_cast<const Foo&>(static_cast<Foo>(b)); // clang / msvc / gcc happy with this
return 0;
}
据我了解
explicit
对运算符干脆禁止
implicit conversions ,并且由于页面列出了它们之间的资格转换,我认为在这种情况下clang是完全错误的?还是我错过了什么?
explicit
约束。
最佳答案
OP 的例子并不是非常少。一个真正最小的示例使用,而不是 static_cast
然后是初始化,简单地说:
const Foo& foo(b);
这就是
static_cast<const Foo&>(b)
无论如何,应该这样做。
const Foo& foo = b;
),则 Clang 和 GCC 都会拒绝。
explicit
转换函数可以用吗?
Under the conditions specified in 8.5.3, a reference can be bound directly to a glvalue or class prvalue that is the result of applying a conversion function to an initializer expression. Overload resolution is used to select the conversion function to be invoked. Assuming that “cv1
T
” is the underlying type of the reference being initialized, and “cvS
” is the type of the initializer expression, withS
a class type, the candidate functions are selected as follows:
- The conversion functions of
S
and its base classes are considered, except that for copy-initialization, only the non-explicit conversion functions are considered. Those that are not hidden withinS
and yield type “lvalue reference to cv2T2
” (when 8.5.3 requires an lvalue result) or “cv2T2
” or “rvalue reference to cv2T2
” (when 8.5.3 requires an rvalue result), where “cv1T
” is reference-compatible (8.5.3) with “cv2T2
”, are candidate functions.
explicit
函数案子)。该决议应被视为可追溯至 C++11。
关于c++ - 显式转换运算符和常量引用限定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66016386/
我是一名优秀的程序员,十分优秀!