除4.9.0-4.9.4和9.1.0之外的大多数gcc版本都认为该C ++ 11代码格式错误,除非有-pedantic
和-fpermissive
选项,这是什么原因?同时使用?
用clang编译。
struct A {
int a;
operator int() && { return a; }
operator int&() & { return a; }
};
void b(int &&) {}
int main()
{
b(A{});
}
输出类似于:
prog.cc: In function 'int main()':
prog.cc:11:10: error: invalid user-defined conversion from 'A' to 'int&&' [-fpermissive]
b(A{});
^
prog.cc:4:5: note: candidate is: A::operator int&() & <near match>
operator int&() & { return a;
答案 0 :(得分:3)
根据StoryTeller的评论,该问题显然与实现中的中间错误有关,并且已修复,可能的解决方案可能是:
#include <utility> //std::move
#include <iostream>
struct A {
int a;
operator int const& () const { std::cout <<__PRETTY_FUNCTION__<<std::endl; return a; }
operator int&&() && { std::cout <<__PRETTY_FUNCTION__<<std::endl; return std::move(a); }
};
void b(int &&) {}
void b(const int &) {}
int main()
{
b(A{});
b(std::move(A{}));
A a;
b(a);
}
输出:
A::operator int&&() && A::operator int&&() && A::operator const int&() const