- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
例如,让我们考虑 static
存储类说明符。以下是此存储类说明符的有效和不正确用法的几个示例:
static int a; // valid
int static b; // valid
static int* c; // valid
int static* d; // valid
int* static e; // ill-formed
static int const* f; // valid
int static const* g; // valid
int const static* h; // valid
int const* static i; // ill-formed
typedef int* pointer;
static pointer j; // valid
pointer static k; // valid
(标记为“有效”的声明已被 Visual C++ 2012、g++ 4.7.2 和 Clang++ 3.1 接受。标记为“格式错误”的声明被所有这些编译器拒绝。)
这看起来很奇怪,因为存储类说明符适用于声明的变量。 static
是声明的变量,而不是声明变量的类型。为什么 e
和 i
格式不正确,而 k
格式正确?
管理存储类说明符的有效放置的规则是什么?虽然我在此示例中使用了 static
,但该问题适用于所有存储类说明符。完整的答案最好引用 C++11 语言标准的相关部分并进行解释。
最佳答案
总之,声明说明符中的任何位置(参见 ISO/IEC 14882-2012 中的第 7.1 节),即在 *
之前。 *
之后的限定符与指针声明符关联,而不是类型说明符,并且 static
在指针声明符的上下文中没有意义。
考虑以下情况:您可以在同一个声明列表中声明一个普通 int 和一个指向 int 的指针,如下所示:
int a, *b;
这是因为类型说明符是 int
,那么您有两个声明使用该类型说明符 int
、a
和一个指针声明符*a
声明一个指向 int
的指针。现在考虑:
int a, static b; // error
int a, *static b; // error
int a, static *b; // error
这应该看起来是错误的(因为它们是),原因(如第 7.1 和 8.1 节中所定义)是因为 C 和 C++ 要求您的存储说明符与您的类型说明符一起使用,而不是在您的声明符中。所以现在应该清楚了,下面的也是错误的,因为上面三个也是错误的:
int *static a; // error
你的最后一个例子,
typedef int* pointer;
static pointer j; // valid
pointer static k; // valid
既有效又等效,因为 pointer
类型被定义为类型说明符,您可以将类型说明符和存储说明符按任何顺序放置。请注意,它们都是等价的,相当于说
static int *j;
static int *k;
或
int static *j;
int static *k;
关于c++ - 可以在声明中的什么位置放置存储类说明符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13073952/
我得到以下声明: // 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
我是一名优秀的程序员,十分优秀!