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

Are local class rules aligned to c++14 return type deduction?

本文关键字:返回类型 c++14 规则 是否      更新时间:2023-10-16

在阅读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自动说明符[dcl.spec.auto]

当然,我觉得在构建变量之前从中读取(和写入)是一件坏事,但我在标准中没有发现任何关于这一点的信息——可能在C++14之前是不可能的?或者有一些我忽略了的基本规则?

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

具有静态存储的块作用域变量的动态初始化持续时间(3.7.1)或线程存储持续时间(3.72)第一次控制通过其声明;这样一个变量是在其初始化完成时被认为是初始化的。

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