所以我一直在使用从std :: vector派生的容器.也许这是一个糟糕的设计决定,原因有几个,而且你是否应该做这样的事情的问题在这里有广泛的讨论:
我确信我已经错过了一些讨论......但是在链接中找到了两个观点的合理论据.据我所知,"因为~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实现继承自带有非虚析构函数的基类.这让我相信这是一种可接受的做法.为什么这样好?这种做法没有危险的具体条件是什么?
我想让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"编译器标志?
我试图编写一个模板化的基类来存储固定数量的数据类型,每个数据类型的长度各不相同.这是我尝试做的很多简化版本:
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) 我有一些头文件是为在C99程序中使用而编写的.此标头包含所有函数定义,并且不与源文件配对.我将它包含在C++文件中.
我的C++编译器标志包括-pedantic -std=c++11,它在头文件中给出了各种警告,例如"ISO C++禁止复合文字"和"ISO C++禁止可变长度数组".显然,C++编译器将C99代码视为C++.两个问题:
谢谢