gpt4 book ai didi

c++ - 为什么我的数组声明为引用数组

转载 作者:太空狗 更新时间:2023-10-29 20:34:22 26 4
gpt4 key购买 nike

今天,在第一次使用 GCC 4.9.2 编译一些代码时,我遇到了一个关于数组被解释为引用数组的奇怪错误。

我能够通过一个简单的例子重现错误。为什么 Link 的构造函数将 buses 解释为 Stuff 的构造函数中的引用数组。

以下代码适用于 MSVC10 和 ICC 11.1

#include <iostream>

struct Bus
{
Bus(std::string n) : name(n) {}
std::string name;
};

template<typename T>
class Link
{
public:
Link(const T* i)
{
data = (T*)i;
}

const T* get() const
{
return data;
}
private:
T* data = nullptr;
};

class Stuff
{
public:
Stuff(Link<Bus> l_b) : link(l_b) {}
private:
Link<Bus> link;
};

void print(Link<Bus> l)
{
std::cout << l.get()->name << '\n';
}

int main(void) {
Bus buses[4] = { Bus("0"), Bus("1"), Bus("2"), Bus("3") };

print(Link<Bus>(&buses[0]));

Stuff s(Link<Bus>(&buses[0]));

return 0;
}

但是对于 GCC 和 Clang,这会产生错误:

main.cpp: In function 'int main()':

main.cpp:44:32: error: declaration of 'buses' as array of references

Stuff s(Link<Bus>(&buses[0]));

然而,对 print 函数的调用按预期工作。我对构造函数失败的原因一无所知。

我找到了解决该问题的方法,方法是像调用 Stuff 的构造函数那样调用总线

Stuff s(Link<Bus>((&buses)[0]));    

但我真的很想知道它为什么会失败。

Live example here

最佳答案

您是 Most Vexing Parse 的受害者规则。

编译器看到:

Stuff s(Link<Bus>((&buses)[0]));

作为名为 s 的函数的函数声明,该函数返回一个 Stuff 对象并请求 Link 对象引用的 0 元素数组.

要解决此问题并告诉编译器您实际上正在尝试创建一个 Stuff 对象,您应该使用 {} 语法来避免歧义:

Stuff s{ Link<Bus>((&buses)[0]) };

关于c++ - 为什么我的数组声明为引用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48830258/

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