小编0x4*_*2D2的帖子

new []如果元素默认构造函数可以抛出?

考虑以下代码:

example_t* a = new example_t[8];
Run Code Online (Sandbox Code Playgroud)

class example_t有默认的ctor可以抛出,假设数组中第5个元素的构造抛出.是否有自动调用4个第一个元素的析构函数?这是一个定义明确的行为吗?

c++

18
推荐指数
2
解决办法
307
查看次数

C++中声明和变量定义之间有什么区别?

我的问题源于Scott Meyers 研究Effective C++.在该书的第二项中,写下如下:

要将常量的范围限制为类,必须使其成为成员,并且为了确保最多只有一个常量副本,必须使其成为静态成员.

这是正确的写.然后立即给出以下示例:

class GamePlayer {
private:
    static const int NumTurns = 5;
    int scores[NumTurns];
    ....
  };
Run Code Online (Sandbox Code Playgroud)

然后写下以下示例:

你在上面看到的是一个声明,而不是NumTurns的定义.

我的第一个问题是:这个陈述的含义是什么?

紧接着提到以下内容:

通常C++要求您为所使用的任何内容提供定义,但是静态和整数类型的类特定常量(例如 - 整数,字符,bools)是一个例外.只要您不接受他们的地址,您就可以声明它们并在不提供定义的情况下使用它们.如果您确实将类的地址设为常量,或者即使您没有使用该地址,您的编译器也错误地坚持定义,您提供了一个单独的定义,如下所示: const int GamePlayer::Numturns; //definition of NumTurns

为什么现在它是一个定义而不是声明?

我理解函数上下文中的差异,但在常规变量的上下文中不理解它.此外,有人可以扩展作者的意思

...如果你确实把一个类的地址定为常数,或者如果你的......部分引用了上面引用的段落?

PS:我是C++的新手.

c++

18
推荐指数
2
解决办法
1649
查看次数

是否有可能在c ++中枚举枚举?

是否有可能在c ++中枚举枚举.我必须有类似的东西:

错误类型:

  • 类型1
  • 类型2
  • 类型3

类型1:

  • 原因1
  • 原因2

类型2:

  • cause3
  • cause4

类型3:

  • cause5
  • cause6

这些中的每一个都是整数值.它们应该用在通信协议栈中.在接收端,接收器必须从接收的值中解码错误的类型和原因.如果不能使用枚举,最好的方法是什么?

c++ enums

17
推荐指数
2
解决办法
6277
查看次数

通过调用移动赋值运算符实现移动构造函数

MSDN文章如何:编写移动构造函数具有以下建议.

如果为类提供移动构造函数和移动赋值运算符,则可以通过编写移动构造函数来调用移动赋值运算符来消除冗余代码.以下示例显示了调用移动赋值运算符的移动构造函数的修订版本:

// Move constructor.
MemoryBlock(MemoryBlock&& other)
   : _data(NULL)
   , _length(0)
{
   *this = std::move(other);
}
Run Code Online (Sandbox Code Playgroud)

这个代码是通过双重初始化MemoryBlock的值来实现低效的,还是编译器能够优化掉额外的初始化?我是否应该通过调用移动赋值运算符来编写移动构造函数?

c++ move-constructor move-semantics c++11

17
推荐指数
2
解决办法
8994
查看次数

为什么序列操作算法谓词是通过复制传递的?

我想知道为什么仿algorithm函数通过副本传递给函数:

template <typename T> struct summatory
{
    summatory() : result(T()) {}

    void operator()(const T& value)
    { result += value; std::cout << value << "; ";};

    T result;
};

std::array<int, 10> a {{ 1, 1, 2, 3, 5, 8, 13, 21, 34, 55 }};
summatory<int> sum;

std::cout << "\nThe summation of: ";
std::for_each(a.begin(), a.end(), sum);
std::cout << "is: " << sum.result;
Run Code Online (Sandbox Code Playgroud)

我期待以下输出:

总和:1; 1; 2; 3; 5; 8; 13; 21; 34; 55; 是:143

但是sum.result包含0,这是在ctor中分配的默认值.实现所需行为的唯一方法是捕获以下内容的返回值for_each …

c++ stl-algorithm c++11

16
推荐指数
2
解决办法
585
查看次数

增量搜索与Visual Studio中的快速查找

Visual Studio中的Incremental Search(Ctrl + I)和Quick Find(Ctrl + F)有什么区别?

incremental-search visual-studio visual-studio-2013

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

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

如果Crockford建议我们将其用于原型继承,为什么不说使用new关键字呢?

我看过一个视频,其中Crockford告诉我们不要使用new关键字.如果我没弄错的话,他说要使用Object.create.new他写道:http://javascript.crockford.com/prototypal.html他为什么告诉我们不要使用它是否已经用它来实现原型继承?

我希望他使用Object.create而不是new像这样:

function object(o) {
    return Object.create((function() {}).prototype = o);
}
Run Code Online (Sandbox Code Playgroud)

那为什么他仍然使用new

javascript

15
推荐指数
2
解决办法
2062
查看次数

为什么类大小仅依赖于数据成员而不依赖于成员函数?

我想知道关于班级大小的详细描述.我想知道是否只有数据成员和成员函数没有任何虚拟关键字,那么为什么类大小只依赖于数据成员.对于例如:

class A {
    int a;
public:
    int display() { 
    cout << "A=" << a << endl;
   }
};
Run Code Online (Sandbox Code Playgroud)

当我检查sizeof(A)我发现它是4字节.为什么会这样?为什么成员函数对A类的大小没有影响?

谢谢

c++ size class

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

主模板中类成员的定义和特化期间的隐式实例化

我有以下示例,我已经从中分解§14.7.3/6 [temp.expl.spec]了在主模板中定义类成员枚举,然后专门化它.以下内容不能在clang中编译:

template<class T>
struct A {
    enum E : T;
};

template<class T>
enum A<T>::E : T { eT };

template<>
enum A<char>::E : char { echar }; // ill-formed, A<char>::E was instantiated
                                  // when A<char> was instantiated

// error: explicit specialization of 'E' after instantiation
Run Code Online (Sandbox Code Playgroud)

原因应该是在专门化之前实例化未编组成员枚举的定义.14.7.1 [temp.inst]/1:

类模板特化的隐式实例化导致隐式实例化未编组成员枚举和成员匿名联合的定义.

我试图理解为什么这是一个问题.是因为如果枚举已经有了定义,那么在专门化期间会导致重新定义错误吗?

c++ enums templates template-specialization c++11

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