【发布时间】:2015-07-16 14:50:20
【问题描述】:
根据来自N4140 的 [basic.lookup.unqual]/8,以下 sn-p 应该可以编译。但它不在clang、gcc 和 vs2013 中。
struct C {
void f(I) {}
using I = int;
};
[basic.lookup.unqual]/8(重点是我的):
对于类
X的成员,成员函数体中使用的名称, 在默认参数中,在异常规范中,在 非静态数据成员 (9.2) 的 brace-or-equal-initializer,或在X定义之外的类成员定义中, 在成员的 declarator-id31 之后,应为 以下列方式之一声明:
- 在其用于使用它的块或封闭块 (6.3) 之前,或
- 应为
X类的成员或X(10.2) 基类的成员,或- ...
31) 即,例如,出现在 parameter-declaration-clause 或 异常规范.
【问题讨论】:
-
在我看来
a name used in a member function body, in a default argument, in an exception-specification, in the brace-or-equal-initializer of a non-static data member (9.2), or in the definition of a class member outside of the definition of X不适用于I。它不在函数体中,它是一个参数,但不是默认的,它与异常或初始化无关,它不在X的定义之外... -
该名称根本不在范围内,因此您无法在成员函数声明器中引用它。引用的文本不会改变这一点。
标签: c++ language-lawyer c++14