gpt4 book ai didi

c++ - 代码在 g++ 4.4.1 上本地编译,但在 codepad.org (g++ 4.1.2) 上不编译? (引用引用问题)?)

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

我正在编写一个测试用例来解决我的应用程序中的一个更大的问题。我结束了在键盘上尝试一些代码,发现在我的本地机器(g++ 4.4.1,with-Wall)上编译的一些代码没有在键盘(g++ 4.1.2)上编译,即使我的本地机器有一个更新的g++ 版本。

Codepad 将此称为对引用错误的引用,我查找并找到了一些相关信息。拥有一个 STL 引用容器似乎不是一个好主意。这是否意味着我需要定义自己的 PairPages 类?如果是这样,为什么它首先在本地编译?怎么回事?

键盘链接:http://codepad.org/UAaJI1rl

#include <deque>
#include <utility>
#include <iostream>

using namespace std;

class Page {
public:
Page() : number_(++count) {}
int getNum() const { return number_; }
private:
static int count;
int number_;
};

int Page::count = 0;

class Book {
public:
Book() : currPageIdx_(3) {
int numPages = 5;
while (numPages > 0) {
pages_.push_back(Page());
numPages--; // oops
}
}
pair<const Page&, const Page&> currPages() { return pagesAt(currPageIdx_); }
pair<const Page&, const Page&> pagesAt(int pageNo) { return make_pair(pages_[pageNo - 1], pages_[pageNo]); }
//const Page& currPages() { return pagesAt(currPageIdx_); }
//const Page& pagesAt(int pageNo);
private:
deque<Page> pages_;
int currPageIdx_;
};

int main() {
Book book;
cout << book.pagesAt(3).first.getNum() << endl;
cout << book.currPages().first.getNum() << endl;
}

最佳答案

A vector (或任何 STL 容器)引用确实是一个坏主意,当您简单地查看元素类型的要求时显而易见 T任何 STL 容器 (ISO C++03 23.1[lib.container.requirements])。它首先说“容器是存储其他对象的对象”。我们可以就此打住,因为引用不是 C++ 中的对象(与指针不同;请注意,C++ 术语中的“对象”并不意味着“类的实例”!)。但是,此外,它需要 T成为Assignable , 其要求引用类型 T& - 如果 T本身就是一些引用类型 U& , 那么构造的类型将是 U& & , 这(对引用的引用)在 C++ 中是非法的。

如果您真的想要一个不管理对象生命周期的容器,那么您应该使用一个指针容器。如果您更喜欢引用的安全性(例如,缺少指针算法和空值),您可以使用 std::tr1::reference_wrapper<T>类,它是用于引用的可复制构造和可分配包装器。

关于c++ - 代码在 g++ 4.4.1 上本地编译,但在 codepad.org (g++ 4.1.2) 上不编译? (引用引用问题)?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1973815/

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