本地类规则是否与c++14返回类型推导一致
Are local class rules aligned to c++14 return type deduction?
在阅读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).不允许的
相关文章:
- 如何获取std::result_of函数的返回类型
- 奇怪的结构&GCC&clang(void*返回类型)
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 截至 C++14 起尾随返回类型语法的合法使用
- BackPort C 14返回类型扣除对C 11
- C++14 'auto'能够获取函数返回类型,我们还需要 std::result_of<> 吗?
- C++14 返回类型的模板enable_if
- 在 C++14 中使用通用 lambda 和自动返回类型特征获得不同的结果
- 本地类规则是否与c++14返回类型推导一致
- C++14中的返回类型推导
- 是否可以找出多态C++ 14 lambda 的参数类型和返回类型
- C++14:使用三元表达式从 constexpr 推导(自动)返回类型
- 是否有可能忽略c++11的尾随返回类型特性,而使用c++14的函数返回类型扣除特性?
- 如何使用Boost实现c++ 14风格的自动返回类型
- c++ 14中的尾随返回类型
- SFINAE与c++ 14返回类型扣除
- 当函数返回类型为 bool 时,为什么我不能在 C++14 中返回共享指针?
- 什么时候应该使用c++ 14自动返回类型扣除
- c++ 14中赋值时的返回类型演绎
- 使用c++ 14使用多个返回类型decltype(auto)