当前位置:   iOS > 正文

Visual Studio C++编译器奇怪的行为

c++,most-vexing-parse,visual-studio-2012,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

我只是想知道为什么这小段代码在Visual Studio中正确编译(并且没有警告).也许结果与GCC和Clang相同,但不幸的是我现在无法测试它们.

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    return 0;
}

cpplearner.. 43

T(i_do_not_exist);是一个具有相同含义的对象声明T i_do_not_exist;.

N4567§6.8[stmt.ambig] p1

语法中涉及表达式语句声明 s 存在歧义:具有函数式显式类型转换的表达式语句(5.2.3),因为其最左侧的子表达式与第一个声明符以a开头的声明无法区分..在这些情况下,该声明是一个声明.(

§8.3[dcl.meaning] p6

在具有表格的声明T DD

( D1 )

所含的类型说明符-ID是相同的,所述含有的声明符-ID的声明

T D1

括号不会改变嵌入式声明符id的类型,但它们可以改变复杂声明符的绑定.

我有时候讨厌C++ ......就像刚才一样. (19认同)

有人可以澄清一下:这是一个"最令人烦恼的解析"问题还是无关的事情? (7认同)

@ user10607我们怎么称它为"略显烦恼的解析"?它可能是"令人烦恼",因为它是模棱两可的,但它不像传统的"最令人头疼的"T函数(U(x),U(y));`,也可能不像"有点烦恼的解析"那样令人烦恼"`T func();` (2认同)


marcinj.. 17

因为它定义了T类型的变量:

http://coliru.stacked-crooked.com/a/d420870b1a6490d7

#include 

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    i_do_not_exist.t = 120;
    std::cout << i_do_not_exist.t;
    return 0;
}

上面的例子看起来很愚蠢,但允许这种语法是有原因的.

一个更好的例子是:

int func1();
namespace A
{
   void func1(int);
   struct X {
       friend int (::func1)();
   };
}

可能还有其他例子.



1> cpplearner..:

T(i_do_not_exist);是一个具有相同含义的对象声明T i_do_not_exist;.

N4567§6.8[stmt.ambig] p1

语法中涉及表达式语句声明 s 存在歧义:具有函数式显式类型转换的表达式语句(5.2.3),因为其最左侧的子表达式与第一个声明符以a开头的声明无法区分..在这些情况下,该声明是一个声明.(

§8.3[dcl.meaning] p6

在具有表格的声明T DD

( D1 )

所含的类型说明符-ID是相同的,所述含有的声明符-ID的声明

T D1

括号不会改变嵌入式声明符id的类型,但它们可以改变复杂声明符的绑定.


我有时候讨厌C++ ......就像刚才一样.
有人可以澄清一下:这是一个"最令人烦恼的解析"问题还是无关的事情?
@ user10607我们怎么称它为"略显烦恼的解析"?它可能是"令人烦恼",因为它是模棱两可的,但它不像传统的"最令人头疼的"T函数(U(x),U(y));`,也可能不像"有点烦恼的解析"那样令人烦恼"`T func();`

2> marcinj..:

因为它定义了T类型的变量:

http://coliru.stacked-crooked.com/a/d420870b1a6490d7

#include 

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    i_do_not_exist.t = 120;
    std::cout << i_do_not_exist.t;
    return 0;
}

上面的例子看起来很愚蠢,但允许这种语法是有原因的.

一个更好的例子是:

int func1();
namespace A
{
   void func1(int);
   struct X {
       friend int (::func1)();
   };
}

可能还有其他例子.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/iOS/detail/8522
推荐阅读
相关标签
  

闽ICP备14008679号