gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:09:15 28 4
gpt4 key购买 nike

我看完引用链接后: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/

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