假设我们有
template <typename T>
struct Foo
{};
和
struct Bar
{
template <typename T>
operator Foo<T>() const { return Foo<T>(); }
};
和
template <typename T>
Foo<T> Baz(T const&) { return Foo<T>(); }
然后,true ? Bar() : Baz(some_expr_of_type_double)
的类型为Foo<double>
,因为Bar
可转换为Foo<double>
。此技巧用于查询some_expr_of_type_double
的类型而不进行评估。
确定a ? b : c
类型的规则是什么?我很欣赏标准的相关部分(我没有副本)。是否有“typeof(b)
必须可以转换为typeof(c)
,反之亦然”,毫无疑问?“
答案 0 :(得分:4)
答案 1 :(得分:3)
它不仅仅是(b)必须可以转换为typeof(c)。这是一套复杂的规则,在5.16:2-6中列出;关于一页长度。有一些尝试和一堆关于左值与右值的东西。
答案 2 :(得分:0)
你有一个C ++ 0x编译器吗?在那种情况下decltype(a ? b : c)
可能吗?但是不确定这是否正确处理引用。任何人吗?
我很欣赏标准的相关部分(我没有副本)
您可以从current draft免费获取WG21 website。
答案 3 :(得分:0)
标准(您可以找到的当前草稿here)完成(如果不一定清楚)解释确切打字程序的工作。我从中得到的是那个 表达式(BOOL?Y:Z):
首先检查从Y到Z的隐式或显式转换类型。 然后它会检查一个类似的基类,或者是否可以将Y类分类为Z.
当然,这个标准是难以消化的,我可能会非常偏离这里,但从我所读到的,突出的部分是我们总是尝试Y-&gt; Z转换。这将使我们相信结果也是Z型。这有趣的副作用是如果我们放置X =(BOOL?Y:Z)并且存在Y-> X和Z-> X转换,但没有Y-> Z转换,那么程序将是不正确的。