C++ 不同的编译结果:Mac与Windows

C++ 不同的编译结果:Mac与Windows,c++,xcode,macos,visual-c++,stl,C++,Xcode,Macos,Visual C++,Stl,全部, 我正在做一个涉及大量使用STL及其跨平台的项目。在Windows上,我使用的是MSVC 2010 Pro,在Mac电脑上,我在雪豹上安装了XCode 4.2 我的代码如下所示: m_sort.m_type.size() == 0 ? m_sort.m_type.push_back( SortObject( SORT_BY_NAME, true ) ) : m_sort.m_type.insert( it - 1, SortObject( SORT_BY_NAME, true ) );

全部,

我正在做一个涉及大量使用STL及其跨平台的项目。在Windows上,我使用的是MSVC 2010 Pro,在Mac电脑上,我在雪豹上安装了XCode 4.2

我的代码如下所示:

m_sort.m_type.size() == 0 ? m_sort.m_type.push_back( SortObject( SORT_BY_NAME, true ) ) : m_sort.m_type.insert( it - 1, SortObject( SORT_BY_NAME, true ) );
其中m_sort.m_type是std::vector,将用于对另一个std::vector进行排序

VisualStudio很好地编译了这段代码:没有警告,也没有错误。 但是,尝试在XCode上编译此代码时,我遇到以下错误:

左操作数到?为空,但右操作数的类型为“迭代器” (又名“正常迭代器”)

有没有一种简单的方法来解决Mac上的错误? 为什么这段代码成功地构建在Windows上? 或者,这可能是SL在XCode上的STL实现与Windows上的MSVC有所不同


谢谢。

用下面的方式写

m_sort.m_type.size() == 0 ? 
   m_sort.m_type.push_back( SortObject( SORT_BY_NAME, true ) ) : 
   ( void )m_sort.m_type.insert( it - 1, SortObject( SORT_BY_NAME, true ) );
<>从C++标准

2如果第二个或第三个操作数的类型为void,则 以下值应保持不变:-第二个或第三个操作数(但不能同时保持) 是一个(可能带括号)抛出表达式(15.1);结果是 另一个的类型和值类别

-第二个和第二个 第三个操作数的类型为void;结果为void类型,为 prvalue。[注:这包括两个操作数都为 抛出表达式。-结束注释]


因此,正如Vlad已经发布的,问题是三元表达式不能有类型组合
?void:T
,除非类型为void的表达式是抛出表达式

这可以通过以下两种方式解决:

1) 将第二个操作数的返回类型强制转换为
void
,这基本上意味着,我们只关心发生的副作用,而不是实际从表达式返回

2) 将给定的三元表达式转换为
if/else
分支


就我个人而言,我非常喜欢选项2,因为它减少了阅读者的认知负荷(并为解释评论提供了更多空间),而且不会对性能造成任何影响

注意,有两种情况下,使用
if/else
语句确实会对三元运算符造成性能损失,但仅限于低优化设置,其中代码的编译器如下所示:

发出分支执行路径,而不是条件移动。但是,在更高的优化设置(O2,O3)上,此代码应发出与此相同的指令。


还请注意,对于具有副作用的表达式,无论哪种方式都必须有分支执行路径,并且所讨论的表达式仅具有副作用。

解决此问题的最简单方法可能是显式if分支。(我假设三元运算符的作用点是对其中一个表达式求值,而不是对另一个表达式求值,这不是正确的使用方法。)如果这恰好是相关的-这可能是因为XCode默认情况下不使用
libc++
标准库实现-我知道您没有使用Boost,但是如果这有助于了解@Xarn,我会在性能方面受到影响吗?同时“?”保存源代码行。;-)@丹尼森鲍姆,很有趣。有证据吗?是的,我不使用Boost,我不需要额外的依赖关系。如果你关心性能,你应该能够衡量它。我怀疑这会有什么不同。在任何情况下,您的代码都是非法的,因此您必须修复它。
if (is_ham){
    taste = 1;
} else {
    taste = 0;
}
taste = (is_ham)? 1 : 0;