尝试使用g++
编译器编译clang
项目时,会出现一个奇怪的错误。
以下是源文件的片段:
std::set<TTransportNetworkId> l_transportNetworkIds;
SelectionResultContainer l_searchResult = p_repo.rootMoc() / LnAny("LNBTS") / LnAny("LNMME");
BOOST_FOREACH(const SelectionResult & l_lnmmeSR, l_searchResult)
{
const MoLnmme & l_lnmme = l_lnmmeSR;
l_transportNetworkIds.insert(*l_lnmme.transportNwId);
}
错误消息是:
conditional expression is ambiguous; 'rvalue_probe<Rrom::DataRep::SelectionResultContainer>' can be converted to 'Rrom::DataRep::SelectionResultContainer' and vice versa
BOOST_FOREACH(const SelectionResult & l_lnmmeSR, l_searchResult)
条件是:
使用gcc_4.3.2
clang
引发了上述错误
已尝试包含导致相同错误的最新boost
库
我的猜测是clang
处理rvalue条件的方式不同于此gcc
版本。
clang
应该是gcc
的替代品,那么如何在不触及源文件的情况下摆脱此错误呢?
clang
中有没有以某种方式禁用这类错误的选项?!
更新 我可以创建一个示例源文件,您可以自己重现:
#include <vector>
#include <boost/foreach.hpp>
class A : public std::vector<int>
{
public:
template <class T>
operator const T &() const;
};
void foo(){
A colA;
int b = 1;
BOOST_FOREACH(b, colA)
{
;
}
}
使用clang 3.2
编译时,会引发上述错误,并对错误发生的位置提供一些额外的见解:
error: conditional expression is ambiguous; 'rvalue_probe<A>' can be converted to 'A' and vice versa BOOST_FOREACH(b, colA)
expanded from macro 'BOOST_FOREACH' f (boost::foreach_detail_::auto_any_t BOOST_FOREACH_ID(_foreach_col) = BOOST_FOREACH_CONTAIN(COL))
expanded from macro 'BOOST_FOREACH_CONTAIN' BOOST_FOREACH_EVALUATE(COL)
expanded from macro 'BOOST_FOREACH_EVALUATE' (true ? boost::foreach_detail_::make_probe((COL), BOOST_FOREACH_ID(_foreach_is_rvalue)) : (COL))
使用gcc_4.7.2
编译此代码时没有错误。
任何想法为什么两个编译器的行为不同?
答案 0 :(得分:0)
我在本文档中找到了解决方案,请参阅http://www.boost.org/doc/libs/1_43_0/boost/foreach.hpp
段:
// Some compilers do not correctly implement the lvalue/rvalue conversion
// rules of the ternary conditional operator.
# if defined(BOOST_FOREACH_NO_RVALUE_DETECTION)
因此,当为clang提供-DBOOST_FOREACH_NO_RVALUE_DETECTION
定义选项时,错误消失。
问题仍然是gcc或clang在这一点上是对还是错。