小编Sap*_*Sap的帖子

什么是C++中的复制/移动构造函数选择规则?什么时候发生移动复制后备?

第一个例子:

#include <iostream>
#include <memory>
using namespace std;

struct A {
    unique_ptr<int> ref;
    A(const A&) = delete;
    A(A&&) = default;
    A(const int i) : ref(new int(i)) { }
    ~A() = default;
};

int main()
{
    A a[2] = { 0, 1 };
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它完美地运作.所以这里使用了MOVE构造函数.

让我们删除移动构造函数并添加一个副本:

#include <iostream>
#include <memory>
using namespace std;

struct A {
    unique_ptr<int> ref;
    A(const A&a) 
        : ref( a.ref.get() ? new int(*a.ref) : nullptr )
    {  }
    A(A&&) = delete;
    A(const int i) : ref(new …
Run Code Online (Sandbox Code Playgroud)

c++ copy-constructor move-constructor c++11

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

在不破坏严格别名规则的情况下,在现代GCC/C++中使用网络缓冲区的正确方法

该计划 - 某种旧式网络消息传递:

// Common header for all network messages.
struct __attribute__((packed)) MsgHeader {
    uint32_t msgType;
};
// One of network messages.
struct __attribute__((packed)) Msg1 {
    MsgHeader header;
    uint32_t field1;
};

// Network receive buffer.
uint8_t rxBuffer[MAX_MSG_SIZE];

// Receive handler. The received message is already in the rxBuffer.
void onRxMessage() {
    // Detect message type
    if ( ((const MsgHeader*)rxBuffer)->msgType == MESSAGE1 ) { // Breaks strict-aliasing!
        // Process Msg1 message.
        const Msg1* msg1 = (const Msg1*)rxBuffer;
        if ( msg1->field1 == …
Run Code Online (Sandbox Code Playgroud)

c++ gcc strict-aliasing c++11

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

如何使用JavaFX 9(替换StyleManager)为应用程序设置几个默认的CSS样式表?

在没有直接和明确替换的情况下排除StyleManager的想法真是太棒了 - 我看到它打破了许多程序!

我需要为整个应用程序(自定义组件,自定义伪类,自定义平台特定的补丁等)进行一些重新设计.在JavaFX 8中,我可以使用:com.sun.javafx.css.StyleManager.getInstance().addUserAgentStylesheet("MyShit.css");

但是在Java 9中,StyleManager不可用.那么有没有办法为每个场景设置CSS?

使用"Application.setUserAgentStylesheet"不是一个选项,因为我不想丢失默认的lookandfeel,我已经调用它来设置MODENA样式.我想扩展默认CSS而不是替换它.我也不想重写整个MODENA(显然).

我真的不想手动为应用程序中的每个表单/场景设置相同的样式表(或将其添加到每个FXML文件).有许多形式,动态构造的对话框.主要原因是,有几个应用程序之间共享的部分(和库),所以我不想硬编码任何样式表(可能有不同的应用程序的名称和路径).

所以我需要一种方法在程序的一个点为应用程序的每个可能场景设置一个额外的样式表.FX9有可能吗?

PS我研究了自定义FXML加载器,CSS加载器,场景加载器和拦截场景创建的其他方法 - 没有办法!

java javafx fxml java-9 javafx-9

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

如何让 CMake 在系统 PATH 上使用默认编译器?

同样的问题和答案。问题是答案似乎是错误的(实际上并不是所问问题的答案)。我可以重新提问吗?问题:

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
$ whereis gcc
cc: /usr/bin/gcc /usr/lib/gcc /usr/local/bin/gcc /usr/libexec/gcc
$ which gcc
/usr/local/bin/gcc
$ /usr/bin/gcc -v
gcc version 4.1.2
$ /usr/local/bin/gcc -v
gcc version 4.8.4
$ gcc -v
gcc version 4.8.4
$ cmake .
-- The C compiler identification is GNU 4.1.2
...
...
Run Code Online (Sandbox Code Playgroud)

本地 GCC 版本如果是 4.8.4 并且系统的默认版本是“4.1.2”。所有其他工具链都遵守 PATH 环境变量并使用本地(较新的)GCC 版本。除了 CMAKE。设置 CC 不是一个好主意,因为可能还有其他二进制工具也可以使用。在脚本开头设置 CMAKE_PROGRAM_PATH 和 CMAKE_PREFIX_PATH 无助于检测编译器。
有没有办法强制 CMAKE 尊重 PATH 变量?

linux path cmake cc

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

即使不使用移动构造函数也是必需的.为什么?

为什么?!为什么C++要求类可以移动,即使它没有被使用!例如:

#include <iostream>
using namespace std;

struct A {
    const int idx;
    //   It could not be compileld if I comment out the next line and uncomment
    // the line after the next but the moving constructor is NOT called anyway!
    A(A&& a) : idx(a.idx) { cout<<"Moving constructor with idx="<<idx<<endl; }
   //  A(A&& a) = delete;
    A(const int i) : idx(i) { cout<<"Constructor with idx="<<i<<endl; }
    ~A() { cout<<"Destructor with idx="<<idx<<endl; }
};

int main()
{
    A a[2] = { …
Run Code Online (Sandbox Code Playgroud)

c++ std c++11 c++14

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

GRUB2 UEFI加载程序如何知道在哪里寻找配置文件(或第二阶段文件所在的位置)?

如果在启用GPT的分区上使用GRUB2,加载程序如何“知道”在哪里找到其配置文件和其他第二阶段的文件?

注意:我发现一些有关配置文件的提及,该配置文件与GRUB的EFI加载器位于同一文件夹中,并且包含来自指定分区的“主要”配置文件的链式加载,但这绝对不正确-只有一个“东西”。 efi”文件。

boot grub uefi guid-partition-table grub2

3
推荐指数
2
解决办法
1403
查看次数

为什么编译器需要复制构造函数,需要并且移动一个并且不使用它们中的任何一个?

我已经尝试过问这个问题,但我还不够清楚.所以这是另一个尝试.我对我的英语很抱歉;)

我们来看看代码:

#include <iostream>
#include <memory>
using namespace std;

struct A {
    unique_ptr<int> ref;

    void printRef() {
        if (ref.get())
            cout<<"i="<<*ref<<endl;
        else
            cout<<"i=NULL"<<endl;
    }

    A(const int i) : ref(new int(i)) { 
        cout<<"Constructor with ";
        printRef();
    }
    ~A() {
        cout<<"Destructor with";
        printRef();
    }
};

int main()
{
    A a[2] = { 0, 1 };
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它无法编译,因为unique_ptr已删除复制构造函数.
奥利?
这个类有一个隐含的移动构造函数,因为unique_ptr有一个.

我们来做一个测试:

#include <iostream>
#include <memory>
using namespace std;

struct A {
    unique_ptr<int> ref;

    void printRef() {
        if (ref.get())
            cout<<"i="<<*ref<<endl;
        else …
Run Code Online (Sandbox Code Playgroud)

c++ constructor copy-constructor move-constructor c++11

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