c++ - 从不在 PIMPL 中提供析构函数(使用 boost scoped_ptr),g++(4.6.1) 不会生成编译错误,为什么?

标签 c++ boost g++ shared-ptr

阅读引用链接后:Must provide destructor in the PIMPL ,我按照示例进行操作,但是 g++(4.6.1) 没有按照我的预期生成编译错误

源代码为:

// Predeclare.h
#include <vector>
#include <boost/scoped_ptr.hpp>
#include <iostream>

struct A;

class Predeclare
{
    std::vector<A> alist_;
    boost::scoped_ptr<A> pa_;
    //A a;

public:
    Predeclare();
    //~Predeclare();

    void print();
    void set(int i);
};


// Predeclare.cpp
#include "Predeclare.h"

struct A
{
    int a;
};

Predeclare::Predeclare(): pa_(new A)
{}
/*
Predeclare::~Predeclare()
{}
*/

void Predeclare::print()
{
    std::cout << pa_->a << '\n';
}

void Predeclare::set(int i)
{
    pa_->a = i;
}

int main()
{
    Predeclare c1;
    c1.set(10);
    c1.print();

    return 0;
}

然后,编译程序

g++ Predeclare.cpp

一切正常,为什么g++(4.6.1)没有生成编译错误?

最佳答案

在您的示例中,编译器只需要 Predeclare 的析构函数。当到达 c1 的声明时在main() 。到那时,A已经在 Predeclare.cpp 的前面部分定义了。

如果您尝试实例化Predeclare在不同的源文件中,您可能会遇到问题。

请注意,实例化 std::vector<A>哪里A不完整会产生未定义的行为。实例化容器时,值类型必须是 Destructible,并且只有完整类型才是 Destructible。

关于c++ - 从不在 PIMPL 中提供析构函数(使用 boost scoped_ptr),g++(4.6.1) 不会生成编译错误,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17204244/

相关文章:

c++ - for_each 但用于将每个元素设置为 C++ 中的值

c++ - Windows 中以毫秒为单位的时间戳

C++:std::chrono 或 boost::chrono

c++ - 为什么没有 boost::container::queue ?

c++ - 使 fatal error : boost/fusion/iterator/equal_to. hpp 没有这样的文件或目录

C++,数组中的地址

c++ - C++程序使用类模板模拟FIFO,出队时返回值3221225477

c++ - 如何通过多个键索引和查询 STL 映射容器?

c++ - Lambda machine-dependent segmentation-fault(可能是编译器错误?)

linux - 为什么即使 nm 找到了符号,链接也会失败?