C++ C++;标准歧义

C++ C++;标准歧义,c++,language-lawyer,C++,Language Lawyer,据我在标准中看到的,以下代码是有效的。它在MSVC1025中编译 const struct omg; struct omg volatile; int main() { return 0; } 限定符const和volatile在这些声明中似乎没有意义。它们既不会帮助也不会伤害编译器和程序员 该标准似乎并不打算消除这些“空洞的歧义”。对于空声明,这是明确允许的 在预处理后,是否还有其他与表达式含义无关的标记?使用-pedantic errors拒绝此代码。clang提供了以下错误:

据我在标准中看到的,以下代码是有效的。它在MSVC1025中编译

const struct omg;
struct omg volatile;

int main()
{
    return 0;
}
限定符
const
volatile
在这些声明中似乎没有意义。它们既不会帮助也不会伤害编译器和程序员

该标准似乎并不打算消除这些“空洞的歧义”。对于空声明
,这是明确允许的

在预处理后,是否还有其他与表达式含义无关的标记?

使用
-pedantic errors
拒绝此代码。clang提供了以下错误:

error: 'const' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations]
const struct omg;
^

error: 'volatile' is not permitted on a declaration of a type [-Werror,-Wmissing-declarations]
< P> C++标准部分7.1.1.1 CV限定符[DCL,类型CV]表示:

[…]如果cv限定符出现在decl说明符序列中,则声明的初始声明符列表应 不能为空。[…]


我不认为MSVC是标准允许或需要的一个可靠的仲裁器。我倾向于怀疑到11025年情况是否会改变:-)在g++上失败:在预处理后,在标准中哪里可以找到与“只能为对象和函数指定限定符?即g++错误消息”等价的东西“这并不意味着你的问题似乎意味着什么。后预处理意味着:当预处理器完成时。我投票并接受了你的答案,即使它没有回答我的问题,因为它的措辞。我在寻找不相关的东西,比如
if(true)既不是完整表达式,也不依赖于其他声明/表达式。@Hector我完全错过了你问题的这一方面,我从更狭义的角度阅读。你可能会得到一个更广泛的答案,这并不罕见。你可以随意拒绝。同时,没有接受的问题通常会得到更多的观点,有时会得到更多的答案,我完全理解。@Hector一般来说,标准避免含糊不清,或者使这种情况成为不正确的或未定义的行为。在其他情况下,标准将定义应如何解决歧义。这是有意义的,因为标准的目标之一是消除潜在的歧义并提供统一的实现。