gpt4 book ai didi

c++ - 为什么 VS 和 gcc 在这里调用不同的转换运算符(const vs non-const)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:27 27 4
gpt4 key购买 nike

这段代码当然很蠢,但我写它只是为了说明问题。在这里:

#include <iostream>
using namespace std;

struct foo {
int a = 42;

template <typename T>
operator T* () {
cout << "operator T*()\n";
return reinterpret_cast<T*>(&a);
}

template <typename T>
operator const T* () const {
cout << "operator const T*() const\n";
return reinterpret_cast<const T*>(&a);
}

template <typename T>
T get() {
cout << "T get()\n";
return this->operator T();
}
};

int main() {
foo myFoo;
cout << *myFoo.get<const int*>() << '\n';
}

使用 Visual Studio 2019(ISO C++17,/Ox)编译时的输出是:

T get()
operator const T*() const
42

gcc 8.3 (-std=c++17, -O3) 的输出是:

T get()
operator T*()
42

所以我想知道为什么两个编译器选择调用不同的 const 限定转换给定这段代码?

如果我将 get() 更改为 get() const,那么两者都会调用转换的 const 版本。但是 VS 从未标记为 const 的方法调用 const 转换是否违反了标准?

编辑:

为了消除关于reinterpret_cast 的一些困惑,here's a version without it这仍然会在两个编译器上产生相同的输出。

最佳答案

方法:

template <typename T> foo::T get();

不是 const .

这意味着在它体内的对象 this是指向 foo 的指针输入(而不是 const foo )。

因此,声明

this->operator T();

将调用 no- const版本因为 overload resolution .

正如 [over.match.best] 上的标准所述, 版本 no-const首选,因为不需要任何cast。事实上,为了调用 const版本,编译器应该隐式转换为一个 const 对象(即 const_cast<const foo*>(this) )。


两者都是gccclang按照我刚才说的去做。

MSVC 根本不遵循这里的标准。

关于c++ - 为什么 VS 和 gcc 在这里调用不同的转换运算符(const vs non-const)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55652070/

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