我正在尝试实现std::vector编程练习.
请考虑以下代码段:
template <class T, class Allocator = std::allocator<T>>
class vector
{
public:
using size_type = size_t;
using allocator_type = Allocator;
...
private:
T* m_data;
allocator_type m_alloc;
size_type m_capacity;
...
};
Run Code Online (Sandbox Code Playgroud)
m_data有类型T*.我需要分配使用std::allocator_traits<allocator_type>::allocate(m_alloc, m_capacity)哪个返回的内存std::allocator_traits<allocator_type>::pointer.
我可以假设,pointer可隐式转换T*并分配从返回的值allocate来m_data?
如果没有,如何正确分配内存vector?
当我尝试编译以下代码时
int main()
{
unsigned char uc;
char & rc = uc;
}
Run Code Online (Sandbox Code Playgroud)
g ++给出以下错误:从'unsigned char'类型的表达式初始化'char&'类型的引用无效.使用signed char而不是unsigned char时会发生同样的情况.但以下编译得很好
int main()
{
unsigned char uc;
const char & rc = uc;
}
Run Code Online (Sandbox Code Playgroud)
为什么不能使用'unsigned char'类型的变量初始化'char&',而可以用它初始化'const char&'?
请考虑以下示例:
template <class T>
class C
{
public:
C();
C(C&& rhs);
private:
T m_data;
};
template <class T>
C<T>::C()
: m_data(T())
{
}
template <class T>
C<T>::C(C&& rhs)
: m_data(rhs.data)
{
}
int main()
{
C<int> i;
}
Run Code Online (Sandbox Code Playgroud)
Line : m_data(rhs.data)包含错误,因为C没有名为的成员data.但是我尝试过的编译器(gcc 5.2,clang 3.5.1)都没有检测到该错误.
但是当我向main函数添加以下行时,编译器会检测到错误:
C<int> j = std::move(i);
Run Code Online (Sandbox Code Playgroud)
为什么编译器在第一种情况下不会出错?
即使没有调用该特定函数,它也可以判断出C没有成员命名data.
另外,当我将move构造函数的定义更改为以下内容时:
template <class T>
C<T>::C(C&& rhs)
: m_data(rhs.data)
{
data = 0;
}
Run Code Online (Sandbox Code Playgroud)
编译器在线提供错误data = 0;但不在线上: …
我使用gcc 4.8.4和-O0标志编译了以下代码:
#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
static jmp_buf env;
static void
doJump(int nvar, int rvar, int vvar)
{
printf("Inside doJump(): nvar=%d rvar=%d vvar=%d\n", nvar, rvar, vvar);
longjmp(env, 1);
}
int
main(int argc, char *argv[])
{
int nvar;
register int rvar;
volatile int vvar;
nvar = 111;
rvar = 222;
vvar = 333;
if (setjmp(env) == 0) {
nvar = 777;
rvar = 888;
vvar = 999;
doJump(nvar, rvar, vvar);
} else {
printf("After longjmp(): nvar=%d rvar=%d vvar=%d\n", nvar, …Run Code Online (Sandbox Code Playgroud) 当我尝试用g ++编译以下代码时:
int main()
{
int a[3] = {0, 1, 2};
int (* p)[] = &a;
}
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误:"无法在初始化中将'int()[3]'转换为'int()[]'.为什么不能将int()[3]转换为int()[]?如果不可能,那么应该如何初始化'int(*)[]'类型的变量?
在C++标准中std::array它说:
数组是可以使用语法初始化的聚合(8.5.1)
array a = {initializer-list};
其中initializer-list是一个逗号分隔的列表,最多包含N个元素,其类型可转换为T.
它还说它std::array是一个聚合类型,它的构造函数是隐式生成的.
要std::array使用初始化列表初始化a ,它必须有一个构造函数std::initializer_list作为参数.
是一个构造函数,它std::initializer_list也为用户定义的类型隐式生成,或者特定于std::array?