MSVCC/g++/icc 中 std deque/向量之间的不同行为

发布于 2024-12-11 07:35:21 字数 643 浏览 0 评论 0原文

我有这段非常简单的代码;

#include <deque>
#include <vector>

using namespace std;

class A
{
public:
    A(){};
    ~A(){};
    deque<A> my_array; // vector<A> my_array;
};

int main(void)
{
}

如果我在 Linux 上使用 g++ 和 icc/icpc 编译此代码,它编译得很好,即使使用 -Wall 它也不会发出警告。如果我将双端队列交换为向量,情况是一样的。

我想使用 MSVCC (cl) 在 Windows 上构建此代码,但不幸的是它会抛出错误 c2027:

error C2027: use of undefined type 'A'

但是如果我将 std::deque 更改为 std::vector它可以在 Visual Studio 2010 中正常编译。

我的问题是;由于某种原因这种行为是可以预料的吗?如果是这样,为什么编译器之间存在差异,或者这是 g++/icc 或 MSVCC 的错误?

I have this very simple piece of code;

#include <deque>
#include <vector>

using namespace std;

class A
{
public:
    A(){};
    ~A(){};
    deque<A> my_array; // vector<A> my_array;
};

int main(void)
{
}

If I compile this code with both g++ and icc/icpc on linux it compiles fine, even with -Wall it gives no warnings. If I swap the deque to a vector the situation is the same.

I would like to build this code on windows using MSVCC (cl) but unfortunately it throws error c2027:

error C2027: use of undefined type 'A'

If however I change the std::deque to a std::vector it compiles fine with Visual Studio 2010.

My question is; is this behaviour to be expected for some reason? If so, why are there differences between compilers or is this a mistake with either g++/icc or MSVCC?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

心头的小情儿 2024-12-18 07:35:21

这是未定义的行为(对于 std::dequestd::vector 都是如此,
所以无论一个实现用它做什么都可以,只要
标准有关。您正在实例化一个标准容器
不完整的类型。

使用 g++ 编译时,-Wall(一般来说,所有选项都以
-W)仅涉及语言。对于图书馆问题,您应该
使用 -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG 进行编译
-D_GLIBCXX_DEBUG_PEDATIC
也是如此。 (如果这导致性能
问题,您可以删除优化构建中的最后两个 -D。)

It's undefined behavior (both with std::deque and with std::vector,
so whatever an implementation does with it is fine, as far as the
standard is concerned. You're instantiating a standard container with
an incomplete type.

When compiling with g++, -Wall (and in general, all options starting
with -W) only concern the language. For library issues, you should be
compiling with -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG
-D_GLIBCXX_DEBUG_PEDANTIC
as well. (If this causes performance
problems, you can remove the last two -D in optimized builds.)

温馨耳语 2024-12-18 07:35:21

除了 James Kanze 的回答之外,我四处搜索并发现这篇 Dobbs 博士文章,它解释了该标准对使用不完整类型的容器的立场。

此外,它还暗示了它适用于 vector 但不适用于 deque 的原因,即实现。典型的向量可能类似于

class vector<T> {
    T* buff;
    int size;
    // ... snip
};

不完整类型,因为我们只有一个指向 T 的指针,但 deque 可以很好地以这样的方式实现(在 VS2010 中):它按值使用 T ,从而使其与不完整类型不兼容。

Further to James Kanze's answer I searched around and found this Dr Dobbs article which explains the standard's stance on using containers with incomplete types.

Further it hints at that the reason it works with vectors but not deques, namely the implementation. A typical vector may be something like

class vector<T> {
    T* buff;
    int size;
    // ... snip
};

which is okay with imcomplete types since we have only a pointer to T but deque could well be implemented in such a way (in VS2010) that it makes use of T by value thus rendering it incompatible with incomplete types.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文