【发布时间】:2012-05-20 12:53:01
【问题描述】:
我在一个大项目中有很多代码,它有两种一般类型的代码,一些以很好的 C++ 风格完成,并且已经过 C++ 专家的代码审查,而另一些则没有,也没有。 not 的代码有很多 for 循环和未经检查的数组(堆)访问,包括读取和写入。幸运的是,所有这些对堆的访问都是通过一个类完成的。为了争论,我们称它为CArray。
CArray 完全在头文件中定义,因为它是模板化的。大致定义如下(只显示相关部分):
template <typename elementType> class CArray
{
/// Most of class details I'm leaving out
public:
inline elementType & operator[](unsigned int i)
{
#ifdef CARRAY_BOUNDARY_DEBUGGING
if(i >= m_numElements)
{
throw SomeException("CArray::operator[] going out of bounds");
}
#endif
return m_pArray[i];
}
/// also have corresponding const version of this operator[]
private:
elementType *m_pArray;
int m_numElements;
}
(请假设构造函数、析构函数、复制构造函数、赋值运算符和相应的右值引用版本都做对了。基本上假设类的用户正确使用这个类所需的一切。
现在的问题是,如果我有一些定义 CARRAY_BOUNDARY_DEBUGGING 的编译单元(.cpp 文件),然后包含这个类(需要代码改进/审查的那些),但其他没有的(那些坚如磐石):
如果类经常通过复制、引用和右值引用(仅限 C++11)在 C++03 的编译单元边界上传递,这是否保证可以并且不会引入问题? C++11?
有没有更好的方法来尝试这样做?
编辑:澄清。我知道非inline 函数必须遵守 C++03 标准第 3.2 节中所述的单一定义规则,但这是内联的。 ODR 是否仍然适用,或者这里还有其他有效的东西?此外,C++03 标准规定“内联函数应在使用它的每个翻译单元中定义。”
【问题讨论】:
标签: c++ templates inline compilationunit