相关疑难解决方法(0)

隐式生成的赋值运算符应该是&ref-qualified吗?

以下代码在gcc 4.8.1上编译没有问题:

#include <utility>

struct foo
{
};

int main()
{
    foo bar;

    foo() = bar;
    foo() = std::move( bar );
}
Run Code Online (Sandbox Code Playgroud)

似乎隐式生成的赋值运算符foo不是&ref-qualified,因此可以在rvalues上调用.根据标准,这是正确的吗?如果是这样,有什么理由要求隐式生成的赋值运算符被重新&限定?

为什么标准不要求生成以下内容?

struct foo
{
  foo & operator=( foo const & ) &;

  foo & operator=( foo && ) &;
};
Run Code Online (Sandbox Code Playgroud)

c++ rvalue rvalue-reference assignment-operator c++11

10
推荐指数
1
解决办法
428
查看次数

方法调用意外地像l值一样

任何人都可以解释为什么这段代码编译:

typedef struct longlong
{
  unsigned long low;
  long high;
}
longlong;

typedef longlong Foo;    

struct FooStruct
{
private:
  Foo bar;

public:
  void SetBar(Foo m)
  {
    bar = m;
  }

  Foo GetBar()
  {
    return bar;
  }
};

int main()
{
  FooStruct f;
  Foo m1 = { 1,1 };
  Foo m2 = { 2,2 };
  f.SetBar(m1);
  f.GetBar() = m2;     // Here I'd expect an error such as
                       // "error: lvalue required as left operand of assignment"
}
Run Code Online (Sandbox Code Playgroud)

我预计编译失败的原因与error: …

c++

10
推荐指数
4
解决办法
738
查看次数

这里发生了什么?我将结果分配给C++中的结果

你能告诉我这里发生了什么吗?为什么有可能呢?

std::make_unique<int>(1) = std::make_unique<int>(1);
Run Code Online (Sandbox Code Playgroud)

我以为这make_unique返回了一个r值......

编辑: 你能提供一些这种结构的有用例子吗?

c++ unique-ptr c++14

9
推荐指数
1
解决办法
554
查看次数

左侧的右值

为什么这段代码会编译?我认为ctor返回的rvalues不在内存中,因此不能用作左值.

#include <iostream>
#include <vector>

class Y {
public :
    explicit Y(size_t num = 0)
    : m_resource {std::vector<int>(num)}
    {
    }

    std::vector<int> m_resource;
};

int main(int argc, const char * argv[]) {
    Y(1) = Y(0); // WHAT?!?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ rvalue lvalue-to-rvalue c++11

8
推荐指数
1
解决办法
778
查看次数

运算符重载,允许使用rvalue捕获但不能分配

是否有可能进行设计以及如何operator+为我的课程重载以使其成为C可能:

C&& c = c1 + c2;
Run Code Online (Sandbox Code Playgroud)

但这不可能:

c1 + c2 = something;
Run Code Online (Sandbox Code Playgroud)

编辑:我将对象更改为小写字母.c1,c2并且c是类的对象C.&&不是逻辑operator&&,而是右值参考.

例如写作:

double&& d = 1.0 + 2.0;
Run Code Online (Sandbox Code Playgroud)

是100%正确的(新)C++代码,而

1.0 + 2.0 = 4.0;
Run Code Online (Sandbox Code Playgroud)

显然是一个编译器错误.我想要完全一样,但对于我的班级,我想要双倍C.

第二次编辑: 如果我的操作符返回C或C&,我可以赋值给rvalue引用,但也可以赋值给c1 + c2,这是无意义的.给const这里禁用它,但它也禁用了对rvalue的赋值.至少在VC++ 2k10上.那么这有多重?

c++ operator-overloading rvalue-reference c++11

7
推荐指数
1
解决办法
445
查看次数

C++ 11:为什么允许分配rvalues?

根据我的理解,返回rvalues对函数的引用是危险的原因是由于以下代码:

T&& f(T&& x) { do_something_to_T(x); return static_cast<T&&>(x); }
T f(const T& x) { T x2 = x; do_something_to_T(x2); return x2; }
T&& y = f(T());
Run Code Online (Sandbox Code Playgroud)

这留下y了一个未定义的悬空参考.

但是,我不明白为什么上面的代码甚至编译?是否有合理的理由将rvalue引用分配给另一个右值引用?粗略地说,rvalues不应该是"临时",即在表达结束时会变得无效吗?能够分配它们对我来说似乎很愚蠢.

c++ rvalue rvalue-reference c++11

5
推荐指数
1
解决办法
3148
查看次数