【发布时间】:2021-05-15 08:49:15
【问题描述】:
这是this 问题的后续。 我玩过这段代码并使用了 clang trunk 和 gcc trunk:
struct A
{
};
struct T
{
A a;
operator A() { return a; }
template <typename T> operator const T&() = delete;
};
struct C
{
A a;
};
int main()
{
C c;
T t;
c.a = t;
}
Clang 没有什么可抱怨的,但 gcc 有:
<source>: In function 'int main()':
<source>:23:11: error: use of deleted function 'T::operator const T&() [with T = A]'
23 | c.a = t;
| ^
<source>:10:27: note: declared here
10 | template <typename T> operator const T&() = delete;
|
^~~~~~~~
那么,哪个编译器是对的,哪个是错的?
我想看看 gcc 是错误的,但是我该如何克服这个错误呢?
【问题讨论】:
-
我添加了
language-lawyer标签,因为我必须删除一个,而且编译器之间的差异不一定是一个错误,所以我删除了compiler-bug。 -
@largest_prime_is_463035818 我认为这很可能是它们中的任何一个的编译器错误,因为似乎很难相信任何关于重载解决方案是依赖于实现的(至少我想不出一个很好的理由应该是)。
-
现在我明白了……我的赌注是 gcc 有一个错误。您可以进一步简化:godbolt.org/z/fo8WKs
-
但是这玩意不是很老了吗?你甚至不需要 C++11 编译器?
-
@orlp 我可以删除一个不同的标签,但只能有 5 个。我将问题理解为询问标准对此有何规定,以及它是否是一个错误将随之而来。 (顺便说一句,编译器错误与否不是我评论的重点,我只是想为 OP 留下关于我更改的内容和原因的说明,以便他们可以回滚、编辑或执行他们认为最合适的操作)
标签: c++ gcc type-conversion operators language-lawyer