相关疑难解决方法(0)

C++默认初始化和值初始化:哪个是调用何时以及如何可靠地初始化模板类型成员

我的问题与以及其他几个相似的问题有些重叠.那些有一些很好的答案,但我已经读过了,我仍然感到困惑,所以请不要认为这个问题是重复的.

所以,我有以下代码:

class A {
    public: int _a;
}

void main()
{
    A inst1;
    A* inst2 = new A;
    A* inst3 = new A();
}
Run Code Online (Sandbox Code Playgroud)

_a未初始化in inst1和in inst2初始化为0in inst3.调用哪个初始化,以及代码为何如此工作?请考虑我的帐户我手头没有C++ 03标准,但我有最后的C++ 11草案(我按'03标准编程),所以'03标准的引用或对'11的引用非常欢迎.

PS这项研究背后的原始任务是正确地初始化任意模板类型的成员T.

c++ initialization default-value

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

不可复制的对象和值初始化:g ++ vs msvc

我看到g ++和msvc在初始化不可复制对象的值之间有一些不同的行为.考虑一个不可复制的类:

class noncopyable_base
{
public:
    noncopyable_base() {}

private:
    noncopyable_base(const noncopyable_base &);
    noncopyable_base &operator=(const noncopyable_base &);
};

class noncopyable : private noncopyable_base
{
public:
    noncopyable() : x_(0) {}
    noncopyable(int x) : x_(x) {}

private:
    int x_;
};
Run Code Online (Sandbox Code Playgroud)

和一个使用值初始化的模板,以便即使类型为POD,该值也将获得已知值:

template <class T>
void doit()
{
    T t = T();
    ...
}
Run Code Online (Sandbox Code Playgroud)

并尝试将它们一起使用:

doit<noncopyable>();
Run Code Online (Sandbox Code Playgroud)

从VC++ 9.0开始,这在msvc上运行正常,但在每个版本的g ++上都失败了我用它(包括版本4.5.0)进行了测试,因为复制构造函数是私有的.

两个问题:

  1. 哪种行为符合标准?
  2. 任何关于如何在gcc中解决这个问题的建议(并且要明确,将其更改T t;为不可接受的解决方案,因为这会打破POD类型).

PS我看到与boost :: noncopyable相同的问题.

c++ gcc visual-c++ value-initialization

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

带参数和不带参数的构造函数之间的区别

这是两个班级

class A
{
    std::string s;
public:
    A() { prn("A constructor"); }
    A(std::string s) : s(s) { prn("A not empty constructor"); }
    A(const A&) { prn("A copy constructor"); }
    A& operator =(const A& a) { prn("A = operator"); return *this; }
    void p() { prn("in A"); }
};

class B
{
public:
    A a;
    B(A aa) : a(aa) { prn("B constructor"); }
    B() { prn("B default constructor"); }
};
Run Code Online (Sandbox Code Playgroud)

现在以下代码正常工作

B b(A("sa"));
b.a.p();
Run Code Online (Sandbox Code Playgroud)

打印:

一个不空的构造
拷贝构造函数
乙构造
的一个

但是如果我使用没有参数的A构造函数会发生奇怪的事情

B …
Run Code Online (Sandbox Code Playgroud)

c++ constructor

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