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