3

C++ STL 容器不允许使用不完整类型进行实例化;这是未定义的行为。

这是绕过该限制的有效“技巧”吗?还是这个技巧仍然有未定义的行为?

#include <vector>

template<template<class, class> class Vector = std::vector>
struct my_incomplete_vector
{
    struct Element;

    // Element is incomplete here, but does it matter anymore?
    typedef Vector<Element, std::allocator<Element> > type;

    struct Element { typename type::iterator value; };
};

int main()
{
    my_incomplete_vector<>::type v;
    v.resize(1);

    // this isn't normally possible without incomplete types
    v[0].value = v.begin();
    return 0;
}
4

1 回答 1

4

这是未定义的行为。如果将类型用作模板的参数,则该标准要求类型是完整的,在模板被实例化的点。并且 my_incomplete_vector::Element当你在里面使用它时是不完整的Element。当然,在您实际实例化您的模板之前不会出现任何问题,但是 g++ 无法使用通常的调试选项 ( -D_GLIBCXX_CONCEPT_CHECKS -D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC) 编译您的代码。

于 2013-09-26T17:34:00.443 回答