无效的用户定义到右值引用的转换

时间:2019-08-13 06:43:08

标签: c++ c++11 gcc

除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; 

1 个答案:

答案 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