C++的可移植性和跨平台开发[2]:语法(2)
标准没有明确规定函数参数的求值顺序。因此,如下的代码行为是不确定的。
void Foo(int a, int b);
int n = 1;
foo(++n, ++n);
★慎用模板特化(不支持新标准)
有些老式编译器对偏特化或全特化支持不够。
★模板继承中,引用基类成员要小心(不支持新标准)
看如下例子:
template
class TBase
{
protected:
typedef std::vector
Container m_container;
};
template
class TDerived : public TBase
{
typedef TBase
public:
void Func()
{
typename BaseClass::Container foo; //可移植
Container foo; //不可移植
this->m_container.clear(); //可移植
m_container.clear(); //不可移植
}
};
★慎用RTTI(不支持新标准、标准未定义)
先声明一下,我这里说的RTTI主要是指typeid操作符和type_info类型。
首先,由于某些老式编译器可能不支持typeid操作符和type_info类型,会导致移植性的问题,这是慎用RTTI的一个原因。(如果你用的是新式编译器,不用考虑这个因素)
其次,由于标准对于type_info类型的约束比较简单。这导致了不同的编译器对type_info的实现有较大差异。如果你确实要使用type_info类型,建议仅仅使用它的operator==和operator!=这两个成员函数。
所以,如果你确实需要在运行时确定类型,又不想碰到上述问题,可以考虑在自己的类体系中加入类型信息来实现。比如MFC和wxWidgets都是这么干的。