gpt4 book ai didi

c++ - g++ : Compilation failed to deduce reference array in case of temporary object

转载 作者:行者123 更新时间:2023-11-30 02:03:56 27 4
gpt4 key购买 nike

我在以下代码中遇到编译错误。我期待即使是暂时的对象可以绑定(bind)到 const 引用。所以我想知道它应该是有效代码。但是,g++ 给我这个错误,而 clang 不会给出这样的错误。谁能告诉我发生这种情况的确切原因?

#include <iostream>

struct TestClass
{
TestClass() : str()
{
strncpy(str, "hello", sizeof(str));
}

char str[6];

char (&getStr())[6]
{
return str;
}
};

template <typename T>
void printFunc(const T& str)
{
std::cout << str << std::endl;
}

int main()
{
TestClass obj;
printFunc(obj.str);
// printFunc(TestClass().str); // <- This line gives compilation error.
printFunc(TestClass().getStr());
return 0;
};

最佳答案

我假设您的 GCC 版本因 TestClass().str 是一个 rvalue 数组(在 C 和 C++ 语言中都是很奇特的东西)这一事实而被绊倒).当初始化程序是 rvalue 时,引用初始化的一些细节实现不正确。显然,这个错误在后来的版本中得到了修复。

同时 obj.strTestClass().getStr() 都是左值数组。它们由直接引用绑定(bind)的直接规则处理,因此不会出现此问题。

解决评论:

如果你修改你的函数模板为

template <typename T> printFunc(const T str)

情况将发生翻天覆地的变化。现在它不再是引用绑定(bind)问题。现在数组到指针的转换规则接管了。

在您的原始版本中,类型 T 被推断为 char [6],而在这个新版本中,它被推断为 char * .当参数传递给函数时,您的数组类型完全丢失:它是一个指针,而是传递给函数。这完全消除了引用绑定(bind)的原始问题,并且无论数组的左值或右值如何,都可以编译代码。

例如,您可以尝试在您的函数中打印 sizeof str 并观察两个版本之间的差异。原始版本将以字节为单位打印您的数组大小 (6),而新版本将打印指针大小(4 对于 ideone 的平台)。

关于c++ - g++ : Compilation failed to deduce reference array in case of temporary object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11276217/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com