小编Joh*_*ren的帖子

如何使用已删除的复制构造函数初始化类数组(C++ 11)

关于为什么我不能初始化对象数组(如果它们有私有拷贝构造函数)的现有问题特指C++ 03.我从那个问题中知道我在C++ 03中不允许做什么,但我认为它应该可以在C++ 11中实现

我有一个不可移动的类(称之为Child),我需要在另一个类的构造函数中初始化一个Child数组(称之为Parent)."不可移动"是指在该对象的生命周期内,Child对象的地址必须保持不变.这样做的正确方法是什么?

使用C++ 11,我尝试了以下内容:

class Child
{
public:
    Child (int x) {}
    ~Child () {}

    Child (const Child &) = delete;
};

class Parent
{
public:
    Parent () : children {{5}, {7}} {}

private:
    Child children[2];
};
Run Code Online (Sandbox Code Playgroud)

此代码与Clang 3.5.0编译良好,但GCC 4.9.1抱怨我正在尝试使用已删除的复制构造函数:

test.cc: In constructor ‘Parent::Parent()’:
test.cc:13:35: error: use of deleted function ‘Child::Child(const Child&)’
     Parent () : children {{5}, {7}} {}
                                   ^
test.cc:7:5: note: declared here
     Child (const Child &) = delete;
     ^
Run Code Online (Sandbox Code Playgroud)

我已经读过复制初始化和直接初始化之间的区别(例如这里 …

c++ arrays gcc clang c++11

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

静态constexpr类成员什么时候需要一个类外定义?

我有以下C++ 11代码(简化版):

struct Info
{
    const char * name;
    int version;
};

class Base
{
public:
    const Info info;
    Base (Info info) : info (info) {}
};

class Derived : public Base
{
public:
    static constexpr Info info = {"Foobar", 2};
    Derived () : Base (info) {}
};

int main ()
{
    static Derived derived;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC 4.9.1编译并链接此代码.另一方面,Clang 3.5.0抱怨未定义的引用:

/tmp/test-109c5c.o: In function `main':
test.cc:(.text+0x1c): undefined reference to `Derived::info'
test.cc:(.text+0x22): undefined reference to `Derived::info'
clang: error: linker command failed …
Run Code Online (Sandbox Code Playgroud)

c++ plugins constexpr c++11

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

为什么-fsanitize = undefined导致"对typeinfo的未定义引用"?

从实际应用程序中减少的以下测试用例无法链接-fsanitize=undefined(使用GCC 6.1.1),但没有它就链接正常.谁能告诉我为什么?

它似乎有事情做了Qt/QObject的,组合-fvisibility=hidden,和-fsanitize=undefined,但究竟问题出在哪里我是无法理解.

lib1.h:

#include <QObject>

class MyObject : public QObject
{
public:
    MyObject (QObject * parent = nullptr);
    ~MyObject ();

    void myMethod ();
};
Run Code Online (Sandbox Code Playgroud)

lib1.cc:

#include "lib1.h"

#define EXPORT __attribute__((visibility("default")))

EXPORT MyObject::MyObject (QObject * parent) : QObject (parent)
{
}

EXPORT MyObject::~MyObject ()
{
}

EXPORT void MyObject::myMethod ()
{
}
Run Code Online (Sandbox Code Playgroud)

lib2.cc:

#include "lib1.h"

void test (MyObject * object)
{
    object->myMethod ();
}
Run Code Online (Sandbox Code Playgroud)

构建步骤:

LIBFLAGS="-fPIC -shared -Wall -Wl,-z,defs"
QTFLAGS="-I/usr/include/qt -I/usr/include/qt/QtCore -lQt5Core"

g++ -fsanitize=undefined …
Run Code Online (Sandbox Code Playgroud)

c++ qt gcc shared-libraries ubsan

6
推荐指数
2
解决办法
1423
查看次数

标签 统计

c++ ×3

c++11 ×2

gcc ×2

arrays ×1

clang ×1

constexpr ×1

plugins ×1

qt ×1

shared-libraries ×1

ubsan ×1