关于占位符类型扣除

时间:2017-07-04 09:32:20

标签: c++ language-lawyer

我在此严格提及c ++草案(N4659)。给出以下示例,

int&& f();
auto x5a = f(); // decltype(x5a) is int

我不确定为什么推断的类型为int,而不是int&& 。斯科特迈耶斯在他的书中说过

  

...,忽略初始化表达式的引用。

但是,我无法在上面的草稿中找到确保声明的任何段落。以下是我为推断类型所采取的步骤:

  1. 根据10.1.7.4.1 [dcl.type.auto.deduct]第2段,

      

    包含占位符类型和相应初始值设定项T的类型e的确定如下:

         
        
    • ...
    •   
    • 对于使用包含占位符类型的类型声明的变量,T是变量的声明类型,e是初始值设定项...
    •   

    因此,Tautoef()

  2. 根据10.1.7.4.1 [dcl.type.auto.deduct]第4段,

      

    如果占位符是自动类型说明符,...从P获取T,将auto的出现替换为新发明的   类型模板参数U或,...使用函数调用" 中的模板参数推导规则,为U "推导一个值,其中   P是函数模板参数类型,相应的参数是e ...

    因此,PUAint&&

  3. 根据17.8.2.1 [temp.deduct.call]第2段,

      

    如果P不是参考类型:

         
        
    1. 如果A是数组类型,...
    2.   
    3. 如果A是函数类型,...
    4.   
    5. 如果A是cv限定类型,...
    6.   

    虽然P = U确实不是参考类型,但A = int&&仍然保持这种状态,因为上述三种情况不适用于A

  4. 这些是我认为与此特定案例相关的唯一段落。 总之,U = int&&和整个T也是int&&

    我在这里肯定遗漏了一些东西,我不确定那些是什么。 如果您足够友好地回答这个问题,您是否会将自己局限于正式措辞(在c ++草案或标准的帮助下)?

0 个答案:

没有答案