来自 const char* 类型的临时对象的 cost char*& 类型的非常量引用的无效初始化

阿努拉格86

编译以下程序后,我收到此错误:

char const* func(char const* a, char const* b)
{
        return std::strcmp(a,b)<0?b:a;
}

char const*& func(char const*& a, char const*& b,char const*& c)
{
        return func(func(a,b),c);
}
int main()
{
    const char* a="First";
    const char* b="Second";
    const char* c="Third";

    func(func(a,b),c); //ERROR
    return 0;
}

问题:

1.由于 func(a,b) 返回值而引发错误,但我不知道原因。

2.为什么在从func(char const*,char const*)返回时创建了临时的?是因为调用方没有变量来收集返回值吗?

编辑:此错误已在其他线程中讨论过,但在这种情况下情况有所不同(尽管希望原因必须相同),因此我问了这个问题,因为在这种情况下解释不明显。请不要将其标记为重复。

JHBonarius

一开始我误判了你的问题,因为我误读了你的代码。实际上,在您的代码char const*& func(char const*& a, char const*& b,char const*& c)中从未被调用;)

这部分代码实际上可以正常工作:

#include<cstring>
char const* func(char const* a, char const* b)
{
    return std::strcmp(a, b)<0 ? b : a;
}

#include<iostream>
int main()
{
    const char* a = "First";
    const char* b = "Second";
    const char* c = "Third";

    std::cout << func(func(a, b), c) << std::endl;
    std::cin.ignore();
    return 0;
}

返回“第三个”

当您将func(func(a, b), c)main更改func(a, b, c). 这是因为您将指针与对指针的引用结合起来。这是可能的,但不是你这样做的方式。

现在,如果您调用func(a, b, c),所有参数都将通过引用传递给第二个函数为了演示这意味着什么,请考虑以下代码:

#include<iostream>
int main()
{
    const char* a = "First";
    std::cout << "a: " << (void*)a << ", &a:" << &a << std::endl;
    const char* b = "Second";
    std::cout << "b: " << (void*)b << ", &b:" << &b << std::endl;
    const char* c = "Third";
    std::cout << "c: " << (void*)c << ", &c:" << &c << std::endl;

    std::cin.ignore();
    return 0;
}    

对我来说,这会返回:

a: 00938B30, &a:00B9FEEC
b: 00938BE4, &b:00B9FEE0
c: 00938BF4, &c:00B9FED4

看?a是一个包含地址的指针,但也有一个指向a! . 当您通过引用调用时,这些会被传递。

然而,该(第二内func)功能,调用第一func其中拷贝的指针值,因为它不通过引用传递参数。这些本地副本是临时值,一旦函数超出范围就会被销毁。出现的问题是第二个 ( func) 函数试图将这个本地副本的地址写入引用调用的值。

好吧,我不知道你是否在这里跟踪我。让我们通过一个例子来演示内存中发生了什么:

#include<cstring>
#include<iostream>

char const* func(char const* const a, char const* const b)
{
    std::cout << "Func1:\n";
    std::cout << "local: a: " << (void*)a << "<--copy, &a:" << &a << "<--*different from main!*\n";
    std::cout << "local: b: " << (void*)b << "<--copy, &b:" << &b << "<--*different from main!*\n";
    return std::strcmp(a, b)<0 ? b : a;
}

char const*& func(char const*& a, char const*& b, char const*& c)
{
    std::cout << "Func2:\n";
    std::cout << "ref: a: " << (void*)a << "<--original, &a:" << &a << "<--original\n";
    std::cout << "ref: b: " << (void*)b << "<--original, &b:" << &b << "<--original\n";
    std::cout << "ref: c: " << (void*)c << "<--original, &c:" << &c << "<--original\n";
    char const* const out = func(func(a, b), c);
    std::cout << "Func2:\n";
    std::cout << "local: out: " << (void*)out << ", &out:" << &out << " (cannot return this local variable to a reference)\n";
    return c; // just to fix it for now
}

int main()
{
    std::cout << "Main:\n";
    const char* a = "First";
    std::cout << "a: " << (void*)a << ", &a:" << &a << "\n";
    const char* b = "Second";
    std::cout << "b: " << (void*)b << ", &b:" << &b << "\n";
    const char* c = "Third";
    std::cout << "c: " << (void*)c << ", &c:" << &c << "\n";

    func(a, b, c);
    std::cin.ignore();
    return 0;
}

对我来说,这会返回:

Main:
a: 00F38D00, &a:005EF78C
b: 00F38C00, &b:005EF780
c: 00F38D08, &c:005EF774
Func2:
ref: a: 00F38D00<--original, &a:005EF78C<--original
ref: b: 00F38C00<--original, &b:005EF780<--original
ref: c: 00F38D08<--original, &c:005EF774<--original
Func1:
local: a: 00F38D00<--copy, &a:005EF5A4<--*different from main!*
local: b: 00F38C00<--copy, &b:005EF5A8<--*different from main!*
Func1:
local: a: 00F38C00<--copy, &a:005EF5A8<--*different from main!*
local: b: 00F38D08<--copy, &b:005EF5AC<--*different from main!*
Func2:
local: out: 00F38D08, &out:005EF680 (cannot return this local variable to a reference)

现场演示

我希望这对你来说足够清楚

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

了解char&和const

来自分类Dev

错误:常量类型为'const char'的对象的默认初始化

来自分类Dev

错误:无法使用类型为“ const char [34]”的左值初始化类型为“ const char”的返回对象

来自分类Dev

const char *返回类型

来自分类Dev

预期的const char *,但参数为char类型

来自分类Dev

类型“ const char **”的参数与类型“ const char *”的参数不兼容

来自分类Dev

为什么data()和c_str()返回char const *,而operator []返回char&?

来自分类Dev

从“ int *”类型的临时类型无效初始化“ int&”类型的非常量引用

来自分类Dev

c ++:“类型为“列表*”的临时类型的类型为“列表&”的非常量引用无效的初始化”

来自分类Dev

'const char *'类型的参数与'char *'类型的参数不兼容

来自分类Dev

C ++-类型的非常量引用的无效初始化

来自分类Dev

类型的非常量引用的无效初始化

来自分类Dev

类型的非常量引用的无效初始化错误

来自分类Dev

类型的非常量引用的无效初始化中的错误

来自分类Dev

从'const char *'到struct中的'char'/未初始化const成员的无效转换

来自分类Dev

预期的预期为'const char **',但参数的类型为'char **'

来自分类Dev

预期的'const char *',但参数在C中的类型为'char **'

来自分类Dev

如何复制const char *类型变量的内容?

来自分类Dev

TypeError:类型为'char const *'的参数

来自分类Dev

分配(const char *)指针类型-分段错误

来自分类Dev

(const char *)++或(const char)++?

来自分类Dev

从int类型的rvalue初始化&Fraction类型的非const引用的无效初始化?

来自分类Dev

从int类型的rvalue初始化&Fraction类型的非const引用的无效初始化?

来自分类Dev

无效的常数添加?错误:无法使用char **初始化const char **

来自分类Dev

istream :: operator >>(const char&)如何执行,因为没有实现此类功能?

来自分类Dev

istream :: get(char&)和operator >>(char&)之间的区别

来自分类Dev

从'const char *'到'unsigned char *'的无效转换

来自分类Dev

从'const char *'到'char *'的无效转换

来自分类Dev

错误:从'char'到'const char *的无效转换*

Related 相关文章

  1. 1

    了解char&和const

  2. 2

    错误:常量类型为'const char'的对象的默认初始化

  3. 3

    错误:无法使用类型为“ const char [34]”的左值初始化类型为“ const char”的返回对象

  4. 4

    const char *返回类型

  5. 5

    预期的const char *,但参数为char类型

  6. 6

    类型“ const char **”的参数与类型“ const char *”的参数不兼容

  7. 7

    为什么data()和c_str()返回char const *,而operator []返回char&?

  8. 8

    从“ int *”类型的临时类型无效初始化“ int&”类型的非常量引用

  9. 9

    c ++:“类型为“列表*”的临时类型的类型为“列表&”的非常量引用无效的初始化”

  10. 10

    'const char *'类型的参数与'char *'类型的参数不兼容

  11. 11

    C ++-类型的非常量引用的无效初始化

  12. 12

    类型的非常量引用的无效初始化

  13. 13

    类型的非常量引用的无效初始化错误

  14. 14

    类型的非常量引用的无效初始化中的错误

  15. 15

    从'const char *'到struct中的'char'/未初始化const成员的无效转换

  16. 16

    预期的预期为'const char **',但参数的类型为'char **'

  17. 17

    预期的'const char *',但参数在C中的类型为'char **'

  18. 18

    如何复制const char *类型变量的内容?

  19. 19

    TypeError:类型为'char const *'的参数

  20. 20

    分配(const char *)指针类型-分段错误

  21. 21

    (const char *)++或(const char)++?

  22. 22

    从int类型的rvalue初始化&Fraction类型的非const引用的无效初始化?

  23. 23

    从int类型的rvalue初始化&Fraction类型的非const引用的无效初始化?

  24. 24

    无效的常数添加?错误:无法使用char **初始化const char **

  25. 25

    istream :: operator >>(const char&)如何执行,因为没有实现此类功能?

  26. 26

    istream :: get(char&)和operator >>(char&)之间的区别

  27. 27

    从'const char *'到'unsigned char *'的无效转换

  28. 28

    从'const char *'到'char *'的无效转换

  29. 29

    错误:从'char'到'const char *的无效转换*

热门标签

归档