L(n)中"ill-formed declaration"的含义
Meaning of "ill-formed declaration" in L(n)
一个code snippet from cppreference.com是这样的:
struct M { };
struct L { L(M&); };
M n;
void f() {
M(m); // declaration, equivalent to M m;
L(n); // ill-formed declaration
L(l)(m); // still a declaration
}
L(n);
被评论为 “格式错误的声明”。
但几乎所有编译器都会发出这样的消息:class“L”不存在默认构造函数。也就是说,它不被认为是病式的,对吧?因为如果我把一行 L() = default;
扔进 L 的正文,它编译成功。
注释是否错误或具有误导性,或者编译器不严格符合标准?
跟进
似乎我在 格式错误 上做错了:
ill-formed - the program has syntax errors or diagnosable semantic
errors. A conforming C++ compiler is required to issue a diagnostic, > even if it defines a language extension that assigns meaning to such > code (such as with variable-length arrays). The text of the standard > uses shall, shall not, and ill-formed to indicate these requirements.
鉴于此,该行在语义上是错误的。
谢谢你们的回答和评论。
我认为这个例子表明声明符可以用括号括起来。
所以这个声明
M(m);
等同于
M m;
即声明了类型为 M
的对象 m
。
不过这个记录
L(n);
可以被认为是一个表达式语句,用 M
类型的参数 n
调用构造函数 L( M & )
或作为一个声明。
C++ 标准将这种歧义解决为声明而不是表达式语句。所以在这条记录中n
就是创建的对象的名称。但是 class L
没有默认构造函数。因此声明格式错误,因为结构 L
没有此声明所需的默认构造函数。
来自 C++ 14 标准(6.8 歧义解析)
1 There is an ambiguity in the grammar involving expression-statements
and declarations: An expression-statement with a function-style
explicit type conversion (5.2.3) as its leftmost subexpression can be
indistinguishable from a declaration where the first declarator starts
with a (. In those cases the statement is a declaration.
要创建表达式语句而不是声明,例如您可以编写
( L )( n );
这条记录
L(l)(m);
是一个正确的声明。使用构造函数 L( M & )
.
声明了类型 L 的对象 l
一个code snippet from cppreference.com是这样的:
struct M { };
struct L { L(M&); };
M n;
void f() {
M(m); // declaration, equivalent to M m;
L(n); // ill-formed declaration
L(l)(m); // still a declaration
}
L(n);
被评论为 “格式错误的声明”。
但几乎所有编译器都会发出这样的消息:class“L”不存在默认构造函数。也就是说,它不被认为是病式的,对吧?因为如果我把一行 L() = default;
扔进 L 的正文,它编译成功。
注释是否错误或具有误导性,或者编译器不严格符合标准?
跟进
似乎我在 格式错误 上做错了:
ill-formed - the program has syntax errors or diagnosable semantic errors. A conforming C++ compiler is required to issue a diagnostic, > even if it defines a language extension that assigns meaning to such > code (such as with variable-length arrays). The text of the standard > uses shall, shall not, and ill-formed to indicate these requirements.
鉴于此,该行在语义上是错误的。
谢谢你们的回答和评论。
我认为这个例子表明声明符可以用括号括起来。
所以这个声明
M(m);
等同于
M m;
即声明了类型为 M
的对象 m
。
不过这个记录
L(n);
可以被认为是一个表达式语句,用 M
类型的参数 n
调用构造函数 L( M & )
或作为一个声明。
C++ 标准将这种歧义解决为声明而不是表达式语句。所以在这条记录中n
就是创建的对象的名称。但是 class L
没有默认构造函数。因此声明格式错误,因为结构 L
没有此声明所需的默认构造函数。
来自 C++ 14 标准(6.8 歧义解析)
1 There is an ambiguity in the grammar involving expression-statements and declarations: An expression-statement with a function-style explicit type conversion (5.2.3) as its leftmost subexpression can be indistinguishable from a declaration where the first declarator starts with a (. In those cases the statement is a declaration.
要创建表达式语句而不是声明,例如您可以编写
( L )( n );
这条记录
L(l)(m);
是一个正确的声明。使用构造函数 L( M & )
.
l