警惕流临时变量对代码可移植性的影响

ZDNet软件频道 时间:2003-06-25 作者:ZDNet China |  我要评论()
本文关键词:cpptips
尽管处理流临时变量是一个棘手的问题,开发者有时候还是忍不住要使用它们。我们要告诉你使用流临时变量通常是一个坏主意。
本文译自Builder.com,未经许可请勿转载尽管处理流临时变量是一个棘手的问题,开发者有时候还是忍不住要使用它们。我们要告诉你使用流临时变量通常是一个坏主意。

请考虑下面的代码:

std::ofstream( "out.txt") << "this should go to out.txt";
// 或者
std::stringstr = "this should be printed to a file";
std::ofstream( "out2.txt") << str;


如你所见,这段代码可以在某些平台上编译通过,在某些平台上则不能通过编译。

按照ANSI C++标准,临时变量是右值(rvalue)。该标准引起了一个有趣的矛盾,因为你可以调用临时对象的非const型函数,但是如果你想通过参数的方法把临时变量传递给一个函数,你只能把它当做const型参数传递,如下面代码所示:

class CTest {};
void use_const_test( const CTest &)
{}
void use_NON_const_test( CTest &)
{}
int main()
{
    // 编译通过:向临时变量传递const型参数
    use_const_test( CTest());
    // 编译错误:试图把非const型参数传递给临时变量
    use_NON_const_test( CTest());
    return 0;
}

你可以用下面的方法来重载运算符“<<”:

  • std::ostream & operator<< (const type & value);(成员函数)
  • std::ostream & operator<< (std::ostream & out, const type & value); (非成员函数)

这样,下面的代码:

std::ofstream( "out.txt") << value1;

  • 如果根据value1的类型,std::ofstream( "out.txt") << value1是成员函数,那么编译通过。
  • 如果根据value1的类型,std::ofstream( "out.txt") << value1不是成员函数,那么编译失败。

根据STL实现的不同,某个重载运算符是否按照成员函数实现是不确定的。这样,代码可能在某个平台上编译通过,但在另一个平台上却编译失败。这就造成了代码不可移植。

注意:如果代码编译失败,错误信息可能会很模糊。例如,GCC 3.2编译器给出如下错误信息:

no match for 'std::ofstream << std::string&' operator. Candidates are ...



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134