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)
哪个编译器版本具有正确的实现,或者在这种情况下未定义行为?
我是protobuf的新手.我需要序列化复杂的图形结构并在C++和Python客户端之间共享它.我正在尝试应用protobuf因为:
但Protobuf用户指南说:
协议缓冲区不是为处理大型消息而设计的.作为一般经验法则,如果您正在处理大于每兆字节的消息,则可能需要考虑替代策略.
https://developers.google.com/protocol-buffers/docs/techniques#large-data
我有类似图形的结构,有时高达1 Gb,超过1 Mb.
为什么protobuf不适合序列化大型数据集?我应该用什么呢?
Kotlin允许我创建两个main()函数.但是不允许两个myfun()函数.
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) 两个编译器为此代码示例生成不同的结果.Clang生成两种不同的类型.G ++使用相同的类型fu和fi.哪一个符合标准?
#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
我注意到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
在这种情况下哪个编译器是正确的?
是否可以使用编译器命令行选项来防止静态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
假设我有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类似的东西
是否可以创建两种类型的并集而无需手动创建交集类型?
问题是我的上下文中的交集类完全没有意义,因此创建它会使代码用户感到困惑.
我的实际案例:我正在描述一个数字硬件模拟器,它是许多模块的分层树状结构:
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) 我需要在我的 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?
例:
#include <iostream>
int main() {
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想知道LOC的总数,包括iostream中包含的所有内容.