小编doc*_*7b5的帖子

gcc4.9.2的std :: vector的libstdc ++实现继承自_Vector_base(非虚拟目标).为什么这样好?

所以我一直在使用从std :: vector派生的容器.也许这是一个糟糕的设计决定,原因有几个,而且你是否应该做这样的事情的问题在这里有广泛的讨论:

你不能继承std :: vector

子类/继承标准容器?

从C++ STL容器中获取是否存在任何真正的风险?

是否可以从STL容器继承实现,而不是委托?

我确信我已经错过了一些讨论......但是在链接中找到了两个观点的合理论据.据我所知,"因为~vector()是非虚拟的"是你不应该从stl容器继承的"规则"的基础.但是,如果我在g ++ 4.9.2中查看std :: vector的实现,我发现std :: vector继承自_Vector_base,而_Vector_base是非虚拟析构函数.

template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
class vector : protected _Vector_base<_Tp, _Alloc>
{
...
  ~vector() _GLIBCXX_NOEXCEPT
  { std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
    _M_get_Tp_allocator()); }

...
}
Run Code Online (Sandbox Code Playgroud)

哪里:

template<typename _Tp, typename _Alloc>
struct _Vector_base
{
...
  ~_Vector_base() _GLIBCXX_NOEXCEPT
  { _M_deallocate(this->_M_impl._M_start, this->_M_impl._M_end_of_storage
    - this->_M_impl._M_start); }

...
}
Run Code Online (Sandbox Code Playgroud)

所以std :: vector的gcc 4.9.2实现继承自带有非虚析构函数的基类.这让我相信这是一种可接受的做法.为什么这样好?这种做法没有危险的具体条件是什么?

c++ inheritance vector libstdc++

17
推荐指数
1
解决办法
1039
查看次数

如何控制在指定CMAKE_CXX_STANDARD时调用的编译器标志?

我想让cmake管理包含"-std = c ++ 14"编译器标志.使用此处所述的CMAKE_CXX_STANDARD很容易做到这一点.这归结为包括以下内容:

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED on)
Run Code Online (Sandbox Code Playgroud)

但是,当使用gcc时,这会导致包含"-std = gnu ++ 14",其中包含一些非标准功能.有没有办法让cmake在使用CMAKE_CXX_STANDARD而不是"-std = gnu ++ 14"时调用"-std = c ++ 14"编译器标志?

cmake c++11 c++14

6
推荐指数
1
解决办法
1503
查看次数

成员数组的大小由模板参数定义,但为什么没有针对零大小数组的警告?

我试图编写一个模板化的基类来存储固定数量的数据类型,每个数据类型的长度各不相同.这是我尝试做的很多简化版本:

template< int NINT, int NR0 >
class EncapsulatedObjectBase
{
   public:

  EncapsulatedObjectBase();

  ~EncapsulatedObjectBase();

  double m_real[NR0];
  int m_int[NINT];
}
Run Code Online (Sandbox Code Playgroud)

是的...所以模板参数可以为零,从而声明一个零长度的对象数组.这个库将有多个派生类,每个派生类定义自己的变量数.我有两个问题:

1)这种方法是否存在根本缺陷?

2)如果是这样的话...当我实例化零长度数组时,为什么icc13或gcc4.7.2没有给我警告?对于gcc我使用-wall和-wextra -wabi.缺乏警告让我觉得这种事情还行.

编辑:

以下是显示我正在谈论的文件的内容:

#include <iostream>

template< int NINT, int NR0 >
class EncapsulatedObjectBase
{
public:
  EncapsulatedObjectBase(){}
  ~EncapsulatedObjectBase(){}

  double m_real[NR0];
  int m_int[NINT];
};


class DerivedDataObject1 : public EncapsulatedObjectBase<2,0>
{
   public:

   DerivedDataObject1(){}

  ~DerivedDataObject1(){}

  inline int& intvar1() { return this->m_int[0]; }
  inline int& intvar2() { return this->m_int[1]; }

};


class DerivedDataObject2 : public EncapsulatedObjectBase<0,2>
{
   public:

   DerivedDataObject2(){}

  ~DerivedDataObject2(){}

  inline double& realvar1() { …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates

5
推荐指数
1
解决办法
1万
查看次数

使用C++编译器包含C头文件时的警告

我有一些头文件是为在C99程序中使用而编写的.此标头包含所有函数定义,并且不与源文件配对.我将它包含在C++文件中.

我的C++编译器标志包括-pedantic -std=c++11,它在头文件中给出了各种警告,例如"ISO C++禁止复合文字"和"ISO C++禁止可变长度数组".显然,C++编译器将C99代码视为C++.两个问题:

  1. 当尝试编写将在使用不同编译器的各种平台上正确运行的代码时,这是一个潜在的问题吗?
  2. 什么是解决警告并生成标准符合代码的好方法?我正在考虑使用gcc制作一个预编译的头文件,但是对于确保我不会因在C++源代码中包含C预编译头而产生意外后果的过程知之甚少.

谢谢

c c++ gcc include

1
推荐指数
1
解决办法
1298
查看次数

标签 统计

c++ ×3

arrays ×1

c ×1

c++11 ×1

c++14 ×1

cmake ×1

gcc ×1

include ×1

inheritance ×1

libstdc++ ×1

templates ×1

vector ×1