我实施一些C++静态分析规则,并且它们中的一个从返回一个引用或指针的功能的参考参数,即,下面的禁止的功能是不符合所有:这个C++静态分析规则是否有意义?
int *f(int& x) { return &x; } // #1
const int *g(const int& x) { return &x; } // #2
int& h(int& x) { return x; } // #3
const int& m(const int& x) { return x; } // #4
的为此给出的理由是“无论参考参数是临时对象还是对参数的引用,它都是实现定义的行为。”然而,我对此感到困惑,因为C++中的流操作符是用这种方式编写的,例如,
std::ostream& operator<<(std::ostream& os, const X& x) {
//...
return os;
}
我觉得我非常有信心,在C++流运营商在普遍表现出实现定义的行为没有,所以这是怎么回事?
根据我目前的理解,我期望#1和#3是明确的,因为临时不能绑定到非const引用,所以int& x
指的是一个真实的对象,具有超出函数范围的生命期,因此返回指向该对象的指针或引用就没有问题。我预计#2会变得狡猾,因为临时可能会被绑定到const int& x
,在这种情况下,试图采用它的地址似乎是一个糟糕的计划。我不清楚#4 - 我的直觉是,这也可能是狡猾的,但我不确定。特别是,我不是在以下情况下会发生什么明确:
const int& m(const int& x) { return x; }
//...
const int& r = m(23);
您正在使用MSVC++吗? – Nawaz 2012-07-18 09:44:38
@Nawaz:我使用.QL在大型代码库中编写查询:)我不认为这应该关系到什么编译器,我理想的是寻找平台无关的答案。 – 2012-07-18 09:47:23
为什么我问,因为MSVC++提供了允许临时绑定到非const引用的编译器扩展。如果您使用的是Microsoft静态分析工具,那么它也可能会考虑此扩展。 – Nawaz 2012-07-18 09:48:53