相关疑难解决方法(0)

什么是右值,左值,x值,glvalues和prvalues?

在C++ 03中,表达式是rvaluelvalue.

在C++ 11中,表达式可以是:

  1. 右值
  2. 左值
  3. x值
  4. glvalue
  5. prvalue

两类已成为五大类.

  • 这些新的表达类别是什么?
  • 这些新类别如何与现有的左值和左值类别相关联?
  • C++ 0x中的右值和左值类别是否与它们在C++ 03中的相同?
  • 为什么需要这些新类别?是WG21神只是想迷惑我们凡人?

c++ expression c++-faq c++11

1291
推荐指数
13
解决办法
17万
查看次数

C++:返回值是L值吗?

考虑以下代码:

struct foo
{
  int a;
};

foo q() { foo f; f.a =4; return f;}

int main()
{
  foo i;
  i.a = 5;
  q() = i;
}
Run Code Online (Sandbox Code Playgroud)

没有编译器抱怨它,甚至Clang.为什么q() = ...线路正确?

c++ return-value lvalue

71
推荐指数
3
解决办法
7471
查看次数

rvalues有什么名字?

@FredOverflow在C++聊天室提到,this是一个罕见的rvalues具有名称的情况.C++ 0x FDIS提到5.1.1 [expr.prim.general] p4:

否则,如果member-declarator声明类X的非静态数据成员(9.2),则表达式this可选的brace-or-equal-initializer 中类型为"指向X的指针"的prvalue.它不应出现在成员声明者的其他地方.(强调我的)

其他人在哪里,如果有的话?

c++ rvalue named c++11

13
推荐指数
2
解决办法
261
查看次数

template参数是否可能是引用类型?

我已经开始学习C ++,目前我正在尝试使用模板,所以,如果我的措辞不是100%准确的,请多多包涵。

我正在使用以下文献:

  • C ++模板:完整指南(第二版)
  • 有效的现代C ++:42种改善C ++ 11和C ++ 14使用的特定方法

第一本书看一下下面的模板函数

template<typename T1, typename T2>
auto max(T1 a, T2 b) -> decltype(b<a?a:b) {
  return b < a ? a : b;
}
Run Code Online (Sandbox Code Playgroud)

并指出,这个定义有一个缺点,因为T1或者T2可能是一个参考,因此,返回类型可以是引用类型。

但是,第二本书指出,如果ParamType在我们的情况下T1T2既不是指针也不是引用(对于我们的情况而言如此),则调用表达式的引用部分将被忽略。

举例说明

template<typename T>
void f(T param);

int x = 27; // as before
const int cx = x; // as before
const int& rx = x; // as before
f(x); // T's and param's types …
Run Code Online (Sandbox Code Playgroud)

c++ templates reference decltype template-argument-deduction

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

为什么重载+ =永远不会在其他人的代码中返回任何内容?

假设我有一个非常简单的课程

class C { 
    private:
        int _a; 
        int _b; 
    public:
        C (int a, int b) :_a { a }, _b { b } {}
        int a () { return _a; }
        int b () { return _b; }
        bool operator== (C c) {
            return this->_a == c.a() && this->_b == c.b();
        }
};
Run Code Online (Sandbox Code Playgroud)

我想重载操作+=,使得

C foo(8, 42);
C bar(1, 1); 
C zoo(9, 43);
foo += bar;
assert(foo == zoo);
Run Code Online (Sandbox Code Playgroud)

运行正常.

至于我读过其他人的代码,我应该写一些类似的东西

C operator+= (C c) {
    return { …
Run Code Online (Sandbox Code Playgroud)

c++ operator-overloading

2
推荐指数
1
解决办法
93
查看次数