【问题标题】:Meaning of `decltype` with more than one argument [duplicate]具有多个参数的`decltype`的含义[重复]
【发布时间】:2014-01-17 12:45:37
【问题描述】:

我在其中找到了a decltype-related question and its answers OP 和回答者似乎都认为 decltype(t,u) 取决于 tu 的类型。

我想decltype(t,u) 的本意是 在链接的问题中是与兼容的最小类型 tu,在某种意义上最小兼容。 如果它的意思类似于 §5(9) 或定义中的 common type std::common_type 来自 §20.9.7.6(3),那么预期的含义是 decltype(true ? t : u).

但是,C++11 似乎只定义了一个单参数decltype。 也就是说,解析器被指定接受decltype( 表达式 ) 其中 expression 可以是 assignment-expression 的逗号分隔列表。 从§7.1.6.2(4) 重新阅读decltype 的规范, 我必须将decltype(t,u) 解释为decltype((u))

问题:那么 decltype(t,u) 实际上是什么?我错过了什么吗?

编辑:随着答案集中在“这是逗号运算符”上,我仍然希望看到 你判断它是decltype((u))(对声明类型的引用)还是decltype(u)(声明类型)。我怀疑是前者。

【问题讨论】:

    标签: c++11


    【解决方案1】:

    这里的逗号是操作符,不是参数分隔符

    【讨论】:

    • 谢谢,我怀疑。但是我的解释是否正确,这使得返回的类型成为u 的声明类型的引用,即decltype((u)) 而不是decltype(u)
    • 我不确定我是否在关注。为什么括号必须与其内容的类型有关?
    • 好吧,我没有从标准草案中搜索确认,但编译器(g++、vc、intel)似乎同意你的观点:decltype(t,u)decltype( (u) )
    • 这是因为decltype有两种情况,一种是直接引用一个对象,decltype(var),decltype(obj.var)和decltype(ptr->var),是变种。其他一切都使用表达式规则,其中 xvalue 变成 T&&,lvalue 变成 T&,其他一切都变成 T。
    【解决方案2】:

    它使用逗号运算符。所以 t,u 属于 u 类型。

    【讨论】:

    • 假设 decltype(u) 产生某种类型 Uudeclared 类型),那么 decltype((u))decltype((t,u)) 将是 U& 类型.因此,如果我们假设decltype(t,u)decltype((t,u)) 相同,那应该与decltype((u)) 相同,而不是decltype(u),对吧?
    猜你喜欢
    • 2017-09-17
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2016-03-21
    • 2011-07-30
    相关资源
    最近更新 更多