小编Hra*_*ant的帖子

在向量中正确分配内存

我正在尝试实现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*并分配从返回的值allocatem_data

如果没有,如何正确分配内存vector

c++ stl allocator c++11 c++14

8
推荐指数
1
解决办法
185
查看次数

g ++给出错误:从'unsigned char'类型的表达式初始化'char&'类型的引用无效

当我尝试编译以下代码时

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&'?

c++ initialization reference

4
推荐指数
1
解决办法
4933
查看次数

C++编译器不检测类模板中的错误

请考虑以下示例:

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;但不在线上: …

c++ templates c++11

4
推荐指数
2
解决办法
593
查看次数

为什么gcc使用-O0进行一些优化

我使用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)

c linux optimization gcc

3
推荐指数
1
解决办法
111
查看次数

为什么g ++会出错:在初始化时无法将'int(*)[3]'转换为'int(*)[]'

当我尝试用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++ arrays pointers

2
推荐指数
1
解决办法
6097
查看次数

隐式生成的初始化列表构造函数

在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

c++ constructor c++11

1
推荐指数
1
解决办法
619
查看次数