小编Mat*_*lia的帖子

如果void实际定义为`struct void {};`,那么现有的C++代码会破坏多少

void在C++类型系统中是一个奇怪的疣.这是一个不完整的类型,无法完成,它有各种有关限制方式的魔术规则:

类型cv void是不完整的类型,无法完成; 这种类型有一组空值.它用作不返回值的函数的返回类型.任何表达式都可以显式转换为cv void([expr.cast]).类型的表达式CV void应仅作为一个表达式语句,作为逗号表达式的操作数,作为一个第二或第三操作数?:([expr.cond]),作为操作数typeid,noexceptdecltype,如在表达return具有返回类型cv 的函数的语句void,或作为显式转换为cv 类型的操作数的语句void.

(N4778,[basic.fundamental]9)

除了对所有这些奇怪规则的痒感之外,由于它的使用方式有限,在编写模板时经常会出现一个痛苦的特殊情况; 通常情况下,我们希望它表现得更像std::monostate.


让我们想象一下,除了上面的引文,标准说的void是类似的东西

这是一个定义相当于以下类型的类型:

struct void {
    void()=default;
    template<typename T> explicit void(T &&) {}; // to allow cast to void
};
Run Code Online (Sandbox Code Playgroud)

保持void *魔法 - 可以别名任何对象,数据指针必须在往返过程中存活void *.

这个:

  • 应涵盖void"适当"类型的现有用例;
  • 可能允许删除关于它通过标准传播的相当数量的垃圾 - 例如[expr.cond]2可能是不需要的,[stmt.return]将大大简化(同时仍然保持"异常",return …

c++ language-design generic-programming void language-lawyer

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

C++/2d向量的大小

如何找到二维向量的大小?到目前为止,我有以下代码,无法编译.

#include <iostream>
#include <vector>

using namespace std;

int main()
{

    vector < vector <int> > v2d;

    for (int x = 0; x < 3; x++)
    {
        for (int y = 0; y < 5; y++)
        {
            v2d.push_back(vector <int> ());
            v2d[x].push_back(y);
        }
    }

    cout<<v2d[0].size()<<endl;
    cout<<v2d[0][0].size()<<endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ size vector dimensions

19
推荐指数
3
解决办法
6万
查看次数

删除"常规"情况的专用模板函数无法使用g ++ <= 4.8.0和clang ++进行编译

使用旧版本的g ++(4.8.0,MinGW)编译项目我发现此代码无法编译:

template<typename T>
void foo() = delete;

template<>
void foo<int>(){}

int main() {
    foo<int>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

似乎g ++甚至没有尝试寻找显式特化,如果它看到基本情况被删除.

mitalia@mitalia:~/scratch$ /opt/mingw32-dw2/bin/i686-w64-mingw32-g++ -std=c++11 buggy_deleted_template.cpp 
buggy_deleted_template.cpp: In function 'int main()':
buggy_deleted_template.cpp:8:14: error: use of deleted function 'void foo() [with T = int]'
     foo<int>();
              ^
buggy_deleted_template.cpp:5:6: error: declared here
 void foo<int>(){}
      ^
mitalia@mitalia:~/scratch$ /opt/mingw32-dw2/bin/i686-w64-mingw32-g++ --version 
i686-w64-mingw32-g++ (rubenvb-4.8.0) 4.8.0
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for …
Run Code Online (Sandbox Code Playgroud)

c++ templates template-specialization deleted-functions c++11

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

从命令行创建MySQL数据库

我正在尝试创建一个批处理文件来创建MySQL数据库.到目前为止,我找到的所有信息都没有起作用.只是为了测试,这就是我想要的......

C:\>mysql -uroot -ppassword < CREATE DATABASE testdb;
C:\>mysql -uroot -ppassword mysql < CREATE DATABASE testdb;
Run Code Online (Sandbox Code Playgroud)

无论我怎么说,我都会收到错误"系统无法找到指定的文件".如果我只是把......

C:\>mysql -uroot -ppassword
Run Code Online (Sandbox Code Playgroud)

它登录MySQL提示正常.我究竟做错了什么?

mysql windows command-line

16
推荐指数
4
解决办法
5万
查看次数

测试多边形是简单还是复杂

对于定义为(x,y)点序列的多边形,如何检测它是否复杂?复杂多边形与自身交叉,如图所示:

示例复杂多边形图像

有没有比检查时间复杂度为O(N 2)的每一对更好的解决方案?

algorithm geometry polygon computational-geometry

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

将bool从参数复制到全局 - 比较编译器输出

完全知道这些完全人为的基准测试并不重要,但我对"大4"编译器选择编写一个简单的片段的几种方式感到有点惊讶.

struct In {
    bool in1;
    bool in2;
};

void foo(In &in) {
    extern bool out1;
    extern bool out2;
    out1 = (in.in1 == true);
    out2 = in.in2;
}
Run Code Online (Sandbox Code Playgroud)

注意:所有编译器都设置为x64模式,具有最高的"通用"(=没有指定特定的处理器体系结构)"优化速度"设置; 你可以通过自己看到的结果/和他们一起玩了,在https://gcc.godbolt.org/z/K_i8h9)


带有-O3的Clang 6似乎产生了最直接的输出:

foo(In&):                             # @foo(In&)
        mov     al, byte ptr [rdi]
        mov     byte ptr [rip + out1], al
        mov     al, byte ptr [rdi + 1]
        mov     byte ptr [rip + out2], al
        ret
Run Code Online (Sandbox Code Playgroud)

在符合标准的C++程序中,== true比较是多余的,因此两个分配都成为从一个内存位置到另一个内存位置的直接副本,al因为内存没有内存mov.

但是,由于这里没有寄存器压力,我原本期望它使用两个不同的寄存器(完全避免两个赋值之间的错误依赖链),可能先启动所有读操作,然后执行所有写操作,以帮助指令级并行; 由于寄存器重命名和积极无序的CPU,这种优化是否已经完全淘汰了最近的CPU?(稍后会详细介绍)


带有-O3的GCC 8.2 …

c++ x86 assembly micro-optimization compiler-optimization

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

兰德实施

我想了解如何实现rand()和srand()函数,并希望调整代码以将其修改为我的要求.我在哪里可以找到rand()和srand()的源代码.

c random gcc

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

如果我用"goto"跳出一个catch块,我保证异常对象是免费的吗?

我有这样的代码如下

try {
  doSomething();
} catch(InterruptException) {
  goto rewind_code;
}

if(0) {
rewind_code:
  longjmp(savepoint, 1);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我goto离开catch块时,C++运行时存储的异常对象是免费的吗?或者运行时是否允许缓存它,直到周围的函数存在或类似的东西?我只是想确保如果我多次执行上面的代码,每次采用倒带代码,我都不会泄漏内存(因为longjmp不会执行编译器在函数序列之前或之前发出的清理代码).

c++ exception abi language-lawyer longjmp

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

标准库中自我赋值 - 不安全移动赋值运算符的基本原理是什么?

关于移动分配的标准库策略是允许实现假设永远不会发生自我分配 ; 在我看来这是一个非常糟糕的主意,因为:

  • C++中的"常规"("复制")转让合同一直被认为是安全的,不能自我分配; 现在我们还有另一个C++记忆和解释的不连贯的角落案例 - 以及一个微妙危险的案例; 我想我们都同意C++中需要的不是更隐藏的陷阱;
  • 它使算法复杂化 - remove_if家庭中的任何事情都需要照顾这个角落的情况;
  • 实现这个要求真的很容易 - 你用swap实现移动它是免费的,甚至在其他情况下(你可以通过ad-hoc逻辑获得一些性能提升)它只是一个,(几乎)从不采取分支,在任何CPU¹上几乎是免费的; 此外,在大多数有趣的情况下(涉及参数或本地的移动),优化器在内联时将完全删除分支(对于"简单"移动赋值运算符几乎总是会发生这种情况).

那么,为什么这样的决定呢?


¹特别是在库代码中,实现者可以自由地利用关于"分支预期结果"的编译器特定提示(在VC++ __builtin_expect中的gcc/__assume中).

c++ move-semantics c++11 move-assignment-operator

13
推荐指数
2
解决办法
953
查看次数

Qt RightClick on QListWidget打开Contextmenu和Delete Item

我想知道当我右键单击表项时如何打开弹出菜单.在弹出菜单中,应该给出一些添加和删除等操作,这将创建一个新行或删除所选行.

我是Qt世界的新手,所以如果有人能给我详细信息(如果可能的话还有代码),那么我将非常感激他/她.

谢谢.

我的目标:只有在QListWidget您点击某个项目的区域内,才会打开包含删除的菜单.


编辑:好的我用QListWidget和菜单解决了问题.现在必须完成以下工作:

如果使用鼠标右键单击某个项目,然后单击"删除",则该项目将被删除.

我的代码:


void ProvideContextMenu(const QPoint &); // MainWindow.h
Run Code Online (Sandbox Code Playgroud)
// In MainWindow.cpp

ui->listFiles->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->listFiles, SIGNAL(customContextMenuRequested(const QPoint &)), 
        this, SLOT(ProvideContextMenu(const QPoint &)));

void MainWindow::ProvideContextMenu(const QPoint &pos)
{
    QPoint item = ui->listFiles->mapToGlobal(pos);
    QMenu submenu;
    submenu.addAction("ADD");
    submenu.addAction("Delete");
    QAction* rightClickItem = submenu.exec(item);
    if (rightClickItem && rightClickItem->text().contains("Delete") )
    {
        ui->listFiles->takeItem(ui->listFiles->indexAt(pos).row());
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑2:好的,我解决了整个问题:D.我上传了我的代码,如果有人需要这样的东西,它可以帮助他/她.

c++ qt

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