- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
考虑以下 C++ 代码:
struct A {};
struct A* b = (1 == 1) ? new struct A : new struct A;
MSVC 接受这一点,但 GCC 和 Clang 不接受。 我想了解根据标准哪个是正确的,以及为什么。
Clang 给出的错误是:
test.cpp:2:37: error: redefinition of 'A'
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:1:8: note: previous definition is here
struct A {};
^
test.cpp:2:37: error: '(anonymous struct at test.cpp:2:37)' cannot be defined in a type specifier
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:41: error: expected class name
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:53: error: expected '{' after base class list
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:53: error: expected ':'
struct A* b = (1 == 1) ? new struct A : new struct A;
^
:
test.cpp:2:24: note: to match this '?'
struct A* b = (1 == 1) ? new struct A : new struct A;
^
test.cpp:2:53: error: expected expression
struct A* b = (1 == 1) ? new struct A : new struct A;
^
这向我暗示 clang 正在尝试将标记 struct A :
解析为 class-specifier,冒号引入 base-clause,然后在解析失败时退出。
但是,我完全不明白为什么它会尝试解析一个class-specifier。查看 latest draft standard 中 new-expression 的语法,它使用 new-type-id 语法产生式,它使用 type-specifier-seq,它使用 type-specifier。但是,class-specifier 不是 type-specifier 的替代方案之一 - 它只是作为 defining-type 的替代方案出现-说明符。另一方面,elaborated-type-specifier 是 type-specifier 的备选方案之一,并且会在此处为我们提供预期的解析。
最佳答案
虽然我没有权威的答案,但我有一个有根据的猜测可以提供。
defining-type-specifier 产品最近才添加到标准中:如果您查看 draft from late 2015 ,它不存在,并且在引入之前,type-specifier 确实有class-specifier作为它的替代品之一。
引入 defining-type-specifier 产生式的 change 是 DR 2141 的解析,它涉及 - 等等 - 涉及 new-expression 的歧义elaborated-type-specifier(尽管它没有具体提及条件表达式)。
Clang 针对 DR 2141 的 implementation status 当前列为“未知”。
所以,我有根据的猜测是:
有一件事我仍然有点困惑:即使尝试解析一个类说明符失败,为什么不回溯并尝试解析一个详细类型说明符 而不是?据推测,这种事情对于消除 class-specifier 和 elaborated-type-specifier 的歧义是必要的,以便在允许的上下文中开始。
关于c++ - new 表达式中详细类型说明符的条件表达式解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46803238/
我得到以下声明: // file MadaPacket.h class MadaPacket { // .... public: inline static bool word_is_header
目录 1.语法 2.关键词decltype 1.语法 decltype ( 实体 ) (1) (C++11 起) decltype
由于某些原因,我一直认为演绎指南必须相同noexcept -它们所引用的构造函数的性质。例如: template struct clazz { clazz(const T &) noexcep
我不确定成员 var isMouseOverYard 的正确访问说明符。在代码片段中,我没有从 House 继承的计划。选项 1 与基类更一致(如果我要从任一类继承,我可以检查鼠标是否在对象/院子上)
我可以声明 foo(const T& var) 这样我就知道 var 不会被改变。 指针的等效格式为 foo(const T* var)? 过去我尝试过那些,与 iterator/const_iter
我已经为这个问题搜索了几个小时,但仍然无法解决。 #include using namespace std; enum color { brown, green, orange, red, yell
我有用户定义的数据类型 typedef Unsigned int8 COMMAND_TYPE[6]; 现在我有类似的功能 ConnectCommand(COMMAND_TYPE const comm
说明符 %[^s] 有什么用? s 是一个变量。 在什么情况下我可以使用这个说明符? 最佳答案 scanf 的 %[ 格式说明符将匹配一系列字符,这些字符与 [ 和 ]< 之间列出的字符相匹配。如果第
#include int main() { char a[8]; printf("%d\n",a) ; return 0; } 对于上面的代码,输出是这
很抱歉这个“另一个”sscanf 问题,但我无法通过实验找到任何解决方案。 这是一个字符串,我想解析并提取 2 个由“:”分隔的子字符串: char *str = "tag:R123:P1234";
所以我在维基百科的一篇文章(粗略翻译)中遇到了以下定义: Modifier (programming) - element of source code being a phrase of given
[basic.link]/6 (我的重点): The name of a function declared in block scope and the name of a variable dec
我正在尝试定义我自己的数据类型(称为 sfloat),它类似于 float ,但使用不同数量的尾数位和指数位以更好地适应我的数据范围和精度。目标是定义一种新的数据类型,可以替代现有应用程序中的 flo
请看下面的代码: #include struct A { A(int, int) {} }; struct tag {}; template struct is_noexcept { st
如果这是一个无知的问题,请原谅我,但我仍在思考何时以及如何使用 constexpr 说明符。 (使用 msvc 14 编译)。我正在研究一个简单的基类,它允许您将任意对象包装到“constexpr 对
考虑以下函数: // Declaration in the .h file class MyClass { template void function(T&& x) const; }; /
以下面的示例代码为例: void test(const Item& item = Item()) { ... } 假设一旦 item 被传递给函数,this 就不能抛出。 问题是:函数应该标记为
我听说 noexcept 关键字更像是“它永远不应该抛出异常”而不是“它不会”。 如果我不确定是否抛出异常,我认为使用 noexcept 关键字不是很好,但是 noexcept 关键字有时
最近,我在阅读API of boost::optional 时发现: T const& operator *() const& ; T& operator *() & ; T&&
如果覆盖 ToString在一个类型中 type TestMe ()= override __.ToString() = null 然后我通过 "%A" 输出它说明符 printfn "*%A
我是一名优秀的程序员,十分优秀!