小编ran*_*dom的帖子

如果元素不可分配,则复制分配地图

struct const_int { const int x = 1; };

int main(int argc, char **argv)
{
    std::unordered_map<int, const_int> map0;
    std::unordered_map<int, const_int> map1 { map0 }; // OK
    map1 = map0; // Compile-time error
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

该代码在Visual C ++ 2017中有效,但在Visual C ++ 2019中失败,并出现编译错误:

14.23.27911\include\list(1210): error C2280: 'std::pair<_Kty,_Ty> &std::pair<_Kty,_Ty>::operator =(volatile const std::pair<_Kty,_Ty> &)': attempting to reference a deleted function
            with
            [
                _Kty=int,
                _Ty=const_int
            ]
Run Code Online (Sandbox Code Playgroud)

哪个编译器版本具有正确的实现,或者在这种情况下未定义行为?

c++

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

为什么protobuf对大型数据结构不利?

我是protobuf的新手.我需要序列化复杂的图形结构并在C++和Python客户端之间共享它.我正在尝试应用protobuf因为:

  • 它与语言无关,具有C++和Python的生成器
  • 它是二进制的.我买不起文本格式,因为我的数据结构很大

但Protobuf用户指南说:

协议缓冲区不是为处理大型消息而设计的.作为一般经验法则,如果您正在处理大于每兆字节的消息,则可能需要考虑替代策略.

https://developers.google.com/protocol-buffers/docs/techniques#large-data

我有类似图形的结构,有时高达1 Gb,超过1 Mb.

为什么protobuf不适合序列化大型数据集?我应该用什么呢?

c++ python protocol-buffers

12
推荐指数
2
解决办法
3321
查看次数

main和regular函数有什么区别?

Kotlin允许我创建两个main()函数.但是不允许两个myfun()函数.

  • main()有什么特别之处?还有其他特殊功能吗?
  • 我可以在同一个包中创建两个静态myfun()函数吗?我希望他们有像main这样的文件范围.

Test1.kt:

package start

fun main(args: Array<String>) {
}

fun myfun(args: Array<String>) {
}
Run Code Online (Sandbox Code Playgroud)

Test2.kt:

package start
// OK!
fun main(args: Array<String>) {
}
// Error! Conflicting overloads
fun myfun(args: Array<String>) {
}
Run Code Online (Sandbox Code Playgroud)

kotlin

12
推荐指数
3
解决办法
952
查看次数

自动模板参数:g ++ 7.3 vs clang ++ 6.0:哪个编译器正确?

两个编译器为此代码示例生成不同的结果.Clang生成两种不同的类型.G ++使用相同的类型fufi.哪一个符合标准?

#include <iostream>

template< auto IVAL>
struct foo {
    decltype(IVAL) x = -IVAL;
};

int main()
{
    foo<10u> fu;
    foo<10> fi;
    std::cout << fi.x << " " << fu.x << '\n';
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

g ++ - 7.3输出:

4294967286 4294967286

clang-6.0输出:

-10 4294967286

c++ g++ clang++ c++17

10
推荐指数
1
解决办法
344
查看次数

在交换机和SFINAE,gcc vs clang中输入类型

我注意到Clang和GCC之间的行为有以下代码:

class convertible {
public:
    operator int() { return 1; }

    template <typename T>
    operator T() { return 1; }
};


int main () {
    convertible x;
    switch (x) {}  // Clang: OK   GCC: Compile error
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

GCC回归 error: default type conversion can't deduce template argument for ‘template<class T> convertible::operator T()’

Clang编译代码没有错误和调用 operator int()

我正在使用Clang 6和GCC 8.两者都使用std = c ++ 11

在这种情况下哪个编译器是正确的?

c++ gcc c++11 clang++

10
推荐指数
0
解决办法
68
查看次数

如何防止优化远离静态const

是否可以使用编译器命令行选项来防止静态const成员优化?

这是一个例子:

template <unsigned v1>
struct TRAITS {
    static const unsigned val1 = v1;
};

template < class TRAITS >
struct foo {
    static const unsigned x1 = TRAITS::val1;
};

int main () {
    foo<TRAITS<1>> f1;
    // SET BREAKPOINT HERE
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译:

g++ -g -O0 optimize_out.cpp
Run Code Online (Sandbox Code Playgroud)

GDB:

gdb a.out
(gdb) break optimize_out.cpp:13
(gdb) r
(gdb) p f1 
$1 = {static x1 = <optimized out>}
Run Code Online (Sandbox Code Playgroud)

这段代码的具体内容是类是模板.可能在C++标准中有一些东西迫使编译器优化字段,即使使用-O0?当我不使用模板时,值不会被优化:

struct foo {
    static const unsigned x1 = 1;
};
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以在调试器中看到x1

c++ g++

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

如何在调试器中运行CTest测试

假设我有CMakeLists.txt

add_executable(mytarget main.cpp)

enable_testing()
add_test(mytarget_test0 mytarget -option0)
Run Code Online (Sandbox Code Playgroud)

有什么简单的方法如何使用某些特定CTest测试的所有命令行选项在GDB中运行mytarget?(除了在CMakeLists中搜索测试,然后手动将add_test参数复制粘贴到命令行之外?)

现实生活中的场景:我使用ctest运行所有测试,但失败了,我想在调试器中快速打开它。

在其他构建系统中,有命令行参数可使用gdb,例如在Meson meson test --gdb testname中的bazel中bazel --run_under=gdbserver。我没有找到与CTest类似的东西

gdb cmake ctest

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

C++:没有虚基类继承的两种类型的联合

是否可以创建两种类型的并集而无需手动创建交集类型?

问题是我的上下文中的交集类完全没有意义,因此创建它会使代码用户感到困惑.

我的实际案例:我正在描述一个数字硬件模拟器,它是许多模块的分层树状结构:

class port;

class module0 {
    port a,b,c;
}

class module1 {
    port c,d,e;
}
Run Code Online (Sandbox Code Playgroud)

我需要创建这两种类型的联合:

class top_level_module {
    port a,b,c,d,e;
}
Run Code Online (Sandbox Code Playgroud)

我想应该有一些技术来创建一个联合类型(这是我要问的问题):

class top_level_module : union_type < module0, module1 > {
    //  port a,b,c,d,e;
}
Run Code Online (Sandbox Code Playgroud)

但我没有找到任何.我在网上找到的唯一解决方案是虚拟继承:

// this is a meaningless type in my context
class intersection_of_module0_module1 { 
    port c;
}

class module0: virtual intersection_of_module0_module1 {
    port a,b;
}

class module1: virtual intersection_of_module0_module1 {
    port d,e;
}

class top_level_module : module0, module1 {
    //  port a,b,c,d,e;
}
Run Code Online (Sandbox Code Playgroud)

c++ c++14

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

CMake 自定义链接可执行命令,如何提取链接器选项?

我需要在我的 CMake 脚本中支持自定义可执行链接命令,即 Synopsys VCS。VCS 是 GCC 的包装器,但它使用特殊语法来传递 LD 选项:

vcs -LDFLAGS "<LINK_FLAGS>" <LINK_LIBRARIES> <OBJECTS>
Run Code Online (Sandbox Code Playgroud)

链接可执行文件的规则存在于CMAKE_CXX_LINK_EXECUTABLE变量中,所以我尝试使用它:

set(CMAKE_CXX_LINK_EXECUTABLE "echo CXXFLAGS: <CMAKE_CXX_LINK_FLAGS>  LINK_FLAGS: <LINKER_FLAGS> LINK_LIBRARIES: <LINK_LIBRARIES> OBJECTS: <OBJECTS> ")
Run Code Online (Sandbox Code Playgroud)

当我构建项目时,我得到:

CXXFLAGS: 
LINK_FLAGS:
LINK_LIBRARIES: -rdynamic ../slib/libslib.a ../dlib/libdlib.so -Wl,-rpath,/home/ripopov/proj_cmake/build/dlib 
OBJECTS: CMakeFiles/sim.dir/sc_main.cpp.o
Run Code Online (Sandbox Code Playgroud)

所以所有链接器标志和库都在 LINK_LIBRARIES

如何从中提取链接器标志LINK_LIBRARIES

linker cmake

4
推荐指数
1
解决办法
6116
查看次数

获取翻译单元中的代码行总数

例:

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

我想知道LOC的总数,包括iostream中包含的所有内容.

c++

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

标签 统计

c++ ×7

clang++ ×2

cmake ×2

g++ ×2

c++11 ×1

c++14 ×1

c++17 ×1

ctest ×1

gcc ×1

gdb ×1

kotlin ×1

linker ×1

protocol-buffers ×1

python ×1