所以我想要做的是创建一个模板类,它可能包含或不包含基于传入的模板参数的成员变量.如下所示:
template<typename T, bool flag>
class base
{
foov<std::enable_if<flag, T>::type> m_var;
};
Run Code Online (Sandbox Code Playgroud)
上面的代码无法在编译器中存活.
有谁知道我怎么能做到这一点?
我有一个 C++ 概念来检查对象数组是否可以动态分配:
template< class T, int N >
concept heap_constructible = requires() {
delete[] new T[N];
};
Run Code Online (Sandbox Code Playgroud)
我意外地发现,在零大小数组N=0和不可访问的(例如private:)构造函数的情况下,编译器的评估会出现分歧:
class A {
A();
};
static_assert( !heap_constructible<A, 5> ); // OK everywhere
static_assert( heap_constructible<A, 0> ); // OK in GCC only
Run Code Online (Sandbox Code Playgroud)
只有 GCC 似乎允许零大小分配A-objects。Clang 打印错误:
calling a private constructor of class 'A'
Run Code Online (Sandbox Code Playgroud)
如果概念稍作修改:
template< class T, int N >
concept heap_constructible1 = requires() {
delete[] new T[N]{}; // note additional empty braced list
};
Run Code Online (Sandbox Code Playgroud)
Clang …
我最近写了一个函数模板,它引用了一个C数组:
template <class T, size_t N>
void foo(T(&c_array)[N]);
Run Code Online (Sandbox Code Playgroud)
假设T是a char,则C字符串的长度N - 1归因于空终止符.我意识到我应该处理边缘情况N == 0,因为那样的N - 1话std::numeric_limits<std::size_t>::max().
因此,为了避免在有人将零长度数组传递给此函数的罕见情况下可能发生的混乱,我进行了检查N == 0.
然而,令我惊讶的是,似乎零长度数组实际上甚至不是数组类型 - 或者至少,这是GCC似乎相信的.实际上,如果具有指针类型签名的函数可用作候选,则零长度数组甚至不绑定到上述函数签名.
请考虑以下代码:
template <class T, size_t N>
void foo(T(&array)[N])
{
std::cout << "Array" << std::endl;
}
void foo(const void* p)
{
std::cout << "Pointer" << std::endl;
}
int main(int argc, char** argv)
{
char array1[10] = { };
const char* pointer = 0;
char array2[0] = …Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main()
{
int a[0],b[4][0];
printf("%d %d ",sizeof(a),sizeof(b));
}
//output
0 0
Run Code Online (Sandbox Code Playgroud)
有什么意义a[0],为什么还允许大小为0的2d数组?
我正在为学校做一个扫雷程序,但我一直在我的代码上得到这个错误
无法分配常量大小为0的数组
我不知道为什么会这样; 我不分配大小-我设置上0的另一个问题是,我怎么能读我输入char的char,所以我可以将它保存在我的阵列?
如下所示,我正在使用输入和输出.我记录了我的输入和输出,所以你们可以看到我正在使用的程序.我想读取char,char所以我可以保存数组上的所有地图.
我正在使用MSVC++ 2010.
freopen("input.txt","rt",stdin);
//4 4
//*...
//....
//.*..
//....
//3 5
//**...
//.....
//.*...
//0 0
freopen("output.txt","wt",stdout);
/*Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100*/
int n=-1;
int m=-1;
int cont =0;
while(n!=0 && m!=0)
{
scanf("%d %d",&n,&m);
int VMatriz[n][m]={0};
int Mapa[n][m]={0};
if (n==0 && m==0)
break;
cont++;
printf("Field #%d",cont);
for (int i=0;i<n;i++)
{ printf("/n");
for (int j=0;j<m;j++)
{
scanf("%d ",&Mapa[i][j]);
if (Mapa[i][j]=='*')
{
if (j-1>=0) …Run Code Online (Sandbox Code Playgroud) 我想使用C预处理器来计算两个代码位置之间的行数.基本想法是这样的:
#define START __LINE__
static char* string_list[] = {
"some string",
"another string",
...
"last string"
};
#define END __LINE__
#if END - START > 42
#error Too many entries
#endif
Run Code Online (Sandbox Code Playgroud)
当然这不起作用,因为在这种情况下START,END仅仅是对__LINE__宏的重新定义.
我正在玩#和##运算符,但我无法让预处理器进行评估START,END而预处理器正在运行.
我的问题是:这有可能吗?
不能选择在运行时检查数组的大小.
预先感谢任何提示或想法!
为什么当空结构的大小为 1 时,零大小的数组会强制结构为零大小,为什么从非零大小的结构继承会导致结构膨胀到基类型的大小?
通过 GCC 5.3.0 编译,以防任何答案取决于 c++ 规范。
#include <iostream>
struct a {};
struct b { int x[0]; };
struct c : a{ int x[0]; };
struct d : b{ int x[0]; };
int main()
{
std::cout << sizeof(a) << std::endl; // 1
std::cout << sizeof(b) << std::endl; // 0
std::cout << sizeof(c) << std::endl; // 4
std::cout << sizeof(d) << std::endl; // 0
}
Run Code Online (Sandbox Code Playgroud) 我们可以使用链接中指定的零长度数组初始化结构:
零长度.
我使用以下结构:
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef struct _CommandHeader
{
UINT16 len;
UINT8 payload[0];
} CommandHeader;
typedef struct _CmdXHeader
{
UINT8 len;
UINT8 payload[0];
} CmdXhHeader;
Run Code Online (Sandbox Code Playgroud)
现在,CommandHeader.payload应该指向/包含到CmdXHeader结构中.即内存应如下所示:
-------------------------------------------------------------
| CommandHeader.len | CmdXHeader.len | CmdXHeader.payload ....|
-------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我可以轻松地将malloc CmdXHeader/CommandHeader定制为自定义长度.但是如何为CmdXHeader有效负载分配值或如何将CmdXHeader对象链接到CommandHeader.payload?
谢谢你的回复.我用以下方式解决了它:
//Get the buffer for CmdXHeader:
size_t cmdXHeader_len = sizeof(CmdXHeader) + custom_len;
CmdXHeader* cmdXHeader = (CmdXHeader*) malloc(cmdXHeader_len);
//Get a temporary pointer and assign the data to it
UINT8* p;
p[0] = 1;
p[2] = 2; …Run Code Online (Sandbox Code Playgroud) 我发现在数组的声明中,我们不能像这样指定它的大小
int a[0];
Run Code Online (Sandbox Code Playgroud)
我知道,C++中的空大小数组是非法的,但在我的代码中,空大小的数组编译器允许并给出输出.
我的代码在这里:
#include <iostream>
using namespace std;
int main()
{
int a[0];
a[0] = 10;
a[1] = 20;
cout<<a[0]<<endl;
cout<<a[1]<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
10
20
Run Code Online (Sandbox Code Playgroud)
在线编译链接:http://code.geeksforgeeks.org/TteOmO
所以,我的问题是,为什么int a[0]允许GCC编译器?
我不明白为什么当我尝试以这种方式初始化结构时出现错误
typedef struct _floor
{
int room;
int height;
int room_dim[room][2];
}Floor;
Run Code Online (Sandbox Code Playgroud)
为什么我不能用空间初始化room_dim数组?