Pio*_*ycz 7 c++ return-type language-lawyer auto c++14
在阅读C++ 14的这一部分(免费草案N4141,最接近C++ 14)时:
9.8本地类声明[class.local]
[..]本地类的名称是其封闭范围的本地名称.[..]
本地类中的声明不得使用(3.2)具有封闭范围的自动存储持续时间的变量.[例如:
Run Code Online (Sandbox Code Playgroud)//[..] 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!
Run Code Online (Sandbox Code Playgroud)
也许看起来没问题,为什么不通过从函数返回值推导出它来使用本地类型,但是 - 看起来这样我可以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();
}
Run Code Online (Sandbox Code Playgroud)
输出只是::
0
Run Code Online (Sandbox Code Playgroud)
但人们可能会期望:
TalkativeInt(7)
7
Run Code Online (Sandbox Code Playgroud)
clang和gcc都没有以任何方式抗议,请参阅演示.
我想知道,或许应该以某种方式提及这种情况
9.8本地类声明[class.local]
或者在
7.1.6.4 auto说明符[dcl.spec.auto]
?
当然,我觉得在变量构造之前从变量中读取(和写入)是件坏事,但是我没有在标准中找到任何关于它的东西 - 可能,在C++ 14之前是不可能的?或者我忽略了一些基本规则?
静态局部变量的规则简单明了:
第一次控制通过其声明时,将执行具有静态存储持续时间(3.7.1)或线程存储持续时间(3.7.2)的块范围变量的动态初始化; 这样的变量在初始化完成后被认为是初始化的.
在[basic.life] /(7.1)中不允许在构造之前访问对象的成员.