为什么返回的字符不能由一个简单表达式中的另一个字符直接分配

qingl97

当我编译以下代码时:

#include <cstdio>

char retChar(){
    return 'c';
}

int main(){
    retChar() = 'f';
}

我收到以下错误:

modify.cpp: In function ‘int main()’:
modify.cpp:8:14: error: lvalue required as left operand of assignment

我已经搜索了与此错误类似的问题,但答案似乎只是针对具体情况。而且我还没有找到问题的答案(也许在其他地方?)

==================================================== ============================

但在以下情况下:

#include <iostream>

class int_Bag{
    int a;
    int b;
public:
    int_Bag(const int x, const int y);
    int_Bag(const int_Bag&c);
    int_Bag& operator =(const int_Bag &c){
        std::cout<< "copy assignment constructor called\n";
        a = c.a;
        b = c.b;
        return *this;
    }

    ~int_Bag();

    void debug();
};

int_Bag::int_Bag(const int x, const int y):a(x),b(y){}

int_Bag::~int_Bag(){
    std::cout<< "destructor called\n";
}

int_Bag::int_Bag(const int_Bag&c):a(c.a),b(c.b){
        std::cout<< "copy constructor called\n";
}

int_Bag getBag(const int_Bag &c){
    return c;
}

void int_Bag::debug(){
    std::cout << a <<"," << b << std::endl;
}

int main(){
    int_Bag *bag1 = new int_Bag(3,4);
    int_Bag *bag2 = new int_Bag(5,6);
    std::cout<< "assignment expression begins\n";
    getBag(*bag1) = *bag2;
    bag1->debug();
    delete bag1;
    delete bag2;
}

该程序可以编译并运行良好:

assignment expression begins
copy constructor called
copy assignment constructor called
destructor called
3,4
destructor called
destructor called

从结果中我们可以看到,当执行getBag()时,将通过调用副本构造函数来创建一个临时对象。因此,我认为在第一种情况下,分配不起作用的原因不仅仅是因为返回的char是临时的。

为什么作业getBag(*bag1) = *bag2;在这里起作用?

这两种情况之间的赋值表达有什么区别?

我想对于第二种情况,整个赋值表达式分为两个步骤:首先调用getBag(),然后调用复制赋值,将* bag2复制到getBag()返回的新创建的临时对象中。但是,在第一种情况下,retChar()返回一个rvalue(也是临时的),该值只能出现在作业的RHS上,如@Jonathan Leffler所说。

第一种情况单独存在似乎只是一个愚蠢的问题(我看到那些负面评论)。我刚才添加的那些问题实际上是我真正困惑的地方。

期待收到有关我的假设和其他答案的评论。

(来自C ++初学者^^)

乔纳森·勒夫勒(Jonathan Leffler)

原始问题

您不能将其分配给类似函数的结果。该函数返回一个r值,该值只能出现在分配的RHS中。与可以分配给它的l值进行对比。

如果您确实想(尽管可能不想这样做),则可以这样写:

char *retChar(){
    static char c = 'c';
    return &c;
}

int main(){
    *retChar() = 'f';
}

现在,您已经修改了函数内部的变量retChar()


修改后的问题

这段代码可以为您的示例提供更详尽的信息:

#include <iostream>

class int_Bag
{
    int a;
    int b;
public:
    int_Bag(const int x, const int y);
    int_Bag(const int_Bag&c);
    int_Bag& operator =(const int_Bag &c){
        std::cout<< "copy assignment constructor called:\nold";
        this->debug();
        std::cout << "new";
        c.debug();
        a = c.a;
        b = c.b;
        return *this;
    }

    ~int_Bag();
    void debug() const;
};

int_Bag::int_Bag(const int x, const int y) : a(x), b(y)
{
    std::cout << "basic(" << x << "," << y << ")\n";
}

int_Bag::~int_Bag()
{
    std::cout << "destructor called";
    this->debug();
}

int_Bag::int_Bag(const int_Bag &c) : a(c.a), b(c.b)
{
    std::cout << "copy constructor called";
    this->debug();
}

int_Bag getBag(const int_Bag &c)
{
    std::cout << "getBag returns";
    c.debug();
    return c;
}

void int_Bag::debug() const
{
    std::cout << "(" << a << "," << b << ")" << std::endl;
}

int main()
{
    int_Bag *bag1 = new int_Bag(3, 4);
    int_Bag *bag2 = new int_Bag(5, 6);

    std::cout << "assignment expression begins\n";
    getBag(*bag1) = *bag2;
    std::cout << "assignment expression ended\n";
    bag1->debug();
    delete bag1;
    delete bag2;
}

当我运行它时,输出为:

basic(3,4)
basic(5,6)
assignment expression begins
getBag returns(3,4)
copy constructor called(3,4)
copy assignment constructor called:
old(3,4)
new(5,6)
destructor called(5,6)
assignment expression ended
(3,4)
destructor called(3,4)
destructor called(5,6)

该值5,6被分配给由创建/返回的临时getBag(),但随后被销毁。这些都不会影响中的原始3,4*bag1由创建的(匿名)对象getBag()可以使用直到它出现在完整表达式的末尾,但不能超过此范围,因此整个分配仍然非常可疑。

我在Mac OS X 10.9.1 Mavericks上使用G ++ 4.8.2或在Ubuntu 13.10上使用G ++ 4.8.1进行编译,在两种情况下均使用以下选项:

g++ -O3 -g -std=c++11 -Wall -Wextra -Werror intbag.cpp -o intbag

编译器没有丝毫杂音,valgrind内存访问模式丝毫没有干扰3.8.1。

我认为C ++可以为您提供足够的帮助,使您可以用脚射击,或者使用类似的混合比喻。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正则表达式是一个字符还是另一个?

来自分类Dev

正则表达式排除一个或另一个字符

来自分类Dev

为什么我的lambda表达式是一个字符?

来自分类Dev

正则表达式从一个字符串到另一个字符串

来自分类Dev

摩擦正则表达式:匹配一个字符,除非在另一个字符之后

来自分类Dev

为什么此正则表达式返回前一个字符?

来自分类Dev

上次出现的字符和另一个字符之间的正则表达式匹配

来自分类Dev

如何把 xpages 正则表达式(第一个字符和最后一个字符)不能是特殊字符

来自分类Dev

正则表达式-查找行中的字符串,但替换同一行中的另一个字符串

来自分类Dev

正则表达式以匹配2个字符串并包含另一个字符串

来自分类Dev

正则表达式:匹配两个字符之间的所有字符,除非也被另一个字符包围

来自分类Dev

正则表达式以匹配多个字符串之一,然后是另一个字符串

来自分类Dev

如何停止在正则表达式中另一个字符串之前是否出现一个字符串

来自分类Dev

使用NSPredicate或正则表达式检查一个大字符串是否包含另一个字符串

来自分类Dev

正则表达式字符串拆分优先考虑一个字符而不是另一个

来自分类Dev

PHP 中的正则表达式:从另一个字符串中检索特定字符串

来自分类Dev

在另一个字符串中查找 JSON 字符串的正则表达式

来自分类Dev

使用正则表达式和 C# 识别另一个字符串中不存在的字符串

来自分类Dev

为什么sub只用正则表达式替换一个字符?

来自分类Dev

为什么*正则表达式可以表示它的前一个字符是或不是

来自分类Dev

一个正则表达式,用于搜索包含一个字符串但不包含另一个字符串的行

来自分类Dev

如何使用正则表达式从另一个字符串的开头删除多个字符串

来自分类Dev

正则表达式中忽略一个字符的最大长度

来自分类Dev

匹配正则表达式中的第一个字符?

来自分类Dev

正则表达式匹配字符串的第一个和最后一个字符,但是为什么呢?

来自分类Dev

检查一个字符串是否包含另一个字符串的全部或3个连续字符?正则表达式python不区分大小写

来自分类Dev

为什么检查另一个字符串是否为空时返回True?

来自分类Dev

不能用存储在变量中的另一个字符串替换一个字符串

来自分类Dev

正则表达式:一个字符的最后一次出现与另一个字符的第一次出现之间的匹配

Related 相关文章

  1. 1

    正则表达式是一个字符还是另一个?

  2. 2

    正则表达式排除一个或另一个字符

  3. 3

    为什么我的lambda表达式是一个字符?

  4. 4

    正则表达式从一个字符串到另一个字符串

  5. 5

    摩擦正则表达式:匹配一个字符,除非在另一个字符之后

  6. 6

    为什么此正则表达式返回前一个字符?

  7. 7

    上次出现的字符和另一个字符之间的正则表达式匹配

  8. 8

    如何把 xpages 正则表达式(第一个字符和最后一个字符)不能是特殊字符

  9. 9

    正则表达式-查找行中的字符串,但替换同一行中的另一个字符串

  10. 10

    正则表达式以匹配2个字符串并包含另一个字符串

  11. 11

    正则表达式:匹配两个字符之间的所有字符,除非也被另一个字符包围

  12. 12

    正则表达式以匹配多个字符串之一,然后是另一个字符串

  13. 13

    如何停止在正则表达式中另一个字符串之前是否出现一个字符串

  14. 14

    使用NSPredicate或正则表达式检查一个大字符串是否包含另一个字符串

  15. 15

    正则表达式字符串拆分优先考虑一个字符而不是另一个

  16. 16

    PHP 中的正则表达式:从另一个字符串中检索特定字符串

  17. 17

    在另一个字符串中查找 JSON 字符串的正则表达式

  18. 18

    使用正则表达式和 C# 识别另一个字符串中不存在的字符串

  19. 19

    为什么sub只用正则表达式替换一个字符?

  20. 20

    为什么*正则表达式可以表示它的前一个字符是或不是

  21. 21

    一个正则表达式,用于搜索包含一个字符串但不包含另一个字符串的行

  22. 22

    如何使用正则表达式从另一个字符串的开头删除多个字符串

  23. 23

    正则表达式中忽略一个字符的最大长度

  24. 24

    匹配正则表达式中的第一个字符?

  25. 25

    正则表达式匹配字符串的第一个和最后一个字符,但是为什么呢?

  26. 26

    检查一个字符串是否包含另一个字符串的全部或3个连续字符?正则表达式python不区分大小写

  27. 27

    为什么检查另一个字符串是否为空时返回True?

  28. 28

    不能用存储在变量中的另一个字符串替换一个字符串

  29. 29

    正则表达式:一个字符的最后一次出现与另一个字符的第一次出现之间的匹配

热门标签

归档