是什么类型的? b:c`?

时间:2010-11-10 21:38:56

标签: c++

假设我们有

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),反之亦然”,毫无疑问?“

4 个答案:

答案 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转换,那么程序将是不正确的。