当前位置:  开发笔记 > 编程语言 > 正文

本地类规则是否与c ++ 14返回类型推导一致?

如何解决《本地类规则是否与c++14返回类型推导一致?》经验,为你挑选了1个好方法。

在阅读C++ 14的这一部分(免费草案N4141,最接近C++ 14)时:

9.8本地类声明[class.local]

[..]本地类的名​​称是其封闭范围的本地名称.[..]

本地类中的声明不得使用(3.2)具有封闭范围的自动存储持续时间的变量.[例如:

//[..]
void f() 
{ 
    static int s ; 
    int x; 
    // [..]
    struct local { 
       int g() { return x; } // error: odr-use of automatic variable x 
       int h() { return s; } // OK 
       // [..]
   };
}
local* p = 0; // error: local not in scope

- 末端的例子]

我注意到,首先 - 我可以p使用返回值自动扣除来定义:

auto f()
{
  static int s;
  int x;
  struct local
  {
     int h() { return s; }
  };
  return local{};
}
decltype(f())* p = 0; // OK - ignored, that local is not in scope!

也许看起来没问题,为什么不通过从函数返回值推导出它来使用本地类型,但是 - 看起来这样我可以s在构造之前访问局部变量:

struct TalkativeInt
{
    TalkativeInt() : value() 
    {
        std::cout << "TalkativeInt()\n";
    }
    TalkativeInt(int value) : value(value) 
    {
        std::cout << "TalkativeInt(" << value << ")\n";
    }

    int value;
};

auto f()
{
  static TalkativeInt s = 7;
  int x;
  struct local
  {
     auto h() { return s.value; }
  };
  return local{};
}
decltype(f())* p = 0;

int main() {
    decltype(f()) l;
    std::cout << l.h();
}

输出只是::

0

但人们可能会期望:

TalkativeInt(7)
7

clang和gcc都没有以任何方式抗议,请参阅演示.

我想知道,或许应该以某种方式提及这种情况

9.8本地类声明[class.local]

或者在

7.1.6.4 auto说明符[dcl.spec.auto]

当然,我觉得在变量构造之前从变量中读取(和写入)是件坏事,但是我没有在标准中找到任何关于它的东西 - 可能,在C++ 14之前是不可能的?或者我忽略了一些基本规则?



1> Columbo..:

静态局部变量的规则简单明了:

第一次控制通过其声明时,将执行具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的块范围变量的动态初始化; 这样的变量在初始化完成后被认为是初始化的.

在[basic.life] /(7.1)中不允许在构造之前访问对象的成员.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有