考虑以下简单代码: struct Base { Base() = default; Base(const Base&); Base(Base&&); }; struct Derived : Base { }; Base foo() { Derived derived; return derived; } clang 8.0.0 prog.cc:21:10: warning: local variable 'derived' will be copied despite being returned by name [-Wreturn-std-move] return derived; ^~~~~~~ prog.cc:21:10: note: call 'std::move' explicitly to avoid copying return derived; ^~~~~~~
以下是关于 c++17 的编程技术问答
我正在关注在线教程:我正在使用vulkan v1.2.135.0,并且着色器设置为#version 450 我几乎完成了本教程的这一部分,我能够渲染一个旋转的广场,当我以调试模式进行编译和运行时,我不会从Vulkan层中遇到错误. 我靠近上面链接提供的页面底部,他在UniformBufferOjbect struct中引入了A glm::vec2,在shader.vert中的同一相应结构中引入了vec2. . 他改变了这些: // Defined in C++ file struct UniformBufferObject { glm::mat4 model; glm::mat4 view; glm::mat4 proj; }; // Defined in shader.vert layout(binding = 0) uniform UniformBufferObject { mat4 model; mat4 view;
我实际上是在尝试用Cmake和Mingw在Windows上工作的VCPKG,但似乎他不想使用mingw 这是错误: -- Running vcpkg install - done -- The C compiler identification is GNU 8.1.0 -- The CXX compiler identification is GNU 8.1.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: C:/Program Files (x86)/mingw-w64/i686-8.1.0-posix-dwarf-rt_v6-rev0/mingw32/bin/gcc.exe - skipped -- Detecting C compile features -- Detecting C compile fe
我一直在尝试弄清楚如何在不调用未定义行为的情况下从C ++ 17访问映射的缓冲区.在此示例中,我将使用Vulkan的所以,根据 C ++中的构造 程序创建,销毁,参考,访问和操纵对象.一个 目的 是 由定义(6.1)创建 新表达 (8.3.4),当隐式更改A的活动成员时 联合(12.3),或创建临时对象(7.4,15.2). 这些显然是创建C ++对象的唯一有效方法.因此,假设我们获得了一个指针,指向主机可见(和连贯的)设备内存的映射区域(当然,假设所有必需的参数都有有效的值,并且呼叫成功,并且返回的内存块是足够的尺寸和正确对准): void* ptr{}; vkMapMemory(device, memory, offset, size, flags, &ptr); assert(ptr != nullptr); 现在,我希望以float数组的形式访问此内存.显而易见的事情是static_cast指针,并以下我的快乐方式: volatile float* flo
是允许编译器优化的(根据C ++ 17标准): : int fn() { volatile int x = 0; return x; } ? int fn() { return 0; } 如果是,为什么?如果不是,为什么不呢? 这是对此主题的一些思考:当前编译器编译fn()作为堆栈上的局部变量,然后将其返回.例如,在X86-64上,GCC创建以下内容: mov DWORD PTR [rsp-0x4],0x0 // this is x mov eax,DWORD PTR [rsp-0x4] // eax is the return register ret 现在,据我所知,标准并不是说应将本地挥发性变量放在堆栈上.因此,此版本同样不错: mov edx,0x0 // this is x mov eax,edx // eax is the return ret 在这里,edx商店x
在当前标准草案(和C ++ 17)中, 写有关static_casting a void *的文章: 可以将类型为"指向 cv1 void"的序言转换为类型"指向 cv2 t"的类型的prvalue,其中t是对象类型和 CV2 与 cv1 相同或更大的CV资格.如果原始指针值代表内存中字节的地址a,并且A不满足t的对齐要求,则未指定结果指针值.否则,如果原始指针值指向对象 a ,并且Type t type T(忽略CV-qualification)的对象 b 与Pointer-em-em可转换为 a ,结果是指向 b 的指针.否则,指针值不变. 我想知道,转换是否可转换有什么区别?当将void *施放到指针交换的东西上时,是否有情况实际上会改变指针值?这种区别的意图是什么? 完整性 pointer interconvertible :: 两个对象a和b是指指针交换,如果: (4.1)它们是同一对象,或 (4.2)一个是联合对象,另一个是该对象的非静态数据成
这是这个问题 在评论和答案中,不止一次说void{} 既不是有效的类型ID也不是有效的表达式. 很好,这很有意义,仅此而已. 然后我通过 [7.1 [7.1] .7.4.1/2] (占位符类型扣除). 在那里说: [...] - 对于以包含占位符类型的返回类型声明的函数中发生的未宣告的return语句,T是已声明的返回类型,e是return语句的操作数.如果return语句没有操作数,则e是void{}; [...] 那么,void{}(概念上)是否合法? 如工作草案中提到的那样可以接受(即使仅作为一个,就好像是 - 陈述一样),它确实必须是合法的.这意味着decltype(void{})也应该有效,例如. 否则,工作草稿使用void()而不是void{}? 好吧,老实说,我敢肯定我不够熟练地指出工作草案中的错误,所以 real 问题是:我的推理中有什么问题? 上面的子弹中提到的void{}到底是什么,为什么在这种情况下是合法的表达?
我继续在std :: string_view上获得错误痕迹,但是我可以构建正常.有没有办法告诉IntelliSense或C ++ Linter使用C ++ 17? 我遇到的具体错误是: namespace "std" has no member "string_view" 解决方案 现在变得更加容易了.在您的VS代码扩展设置中搜索cppstandard,并选择您希望将扩展名的C ++版本从下拉列表中使用. 为了确保您的调试器使用相同的版本,请确保您对tasks.json有这样的内容,其中重要行是--std,而在定义版本之后的行. { "tasks": [ { "type": "cppbuild", "label": "C/C++: g++ build active file", "command": "/usr/bin/g++", "args": [ "-std=c++17",
在这里,我正在使用Visual Studio 2019 Community Edition.我从文件 - > new->现有项目打开一个文件夹.但是每当我构建和运行程序时.它说 无法启动程序'o:\ 1.fourth 学期\ programminh \ main \ debug \ main2.exe' 该系统找不到指定的文件 有很多程序.像bubble.cpp一样,binary.cpp,但它运行main2.exe. 这是我的linear.cpp文件 #include using namespace std; int main(){ int n, an, arr[30], key, i, found=0; cout>n; cout
我正在通过Visual Studio 2012提供的V142工具集升级到C ++ 17.使用此工具集运行我的程序时,OS报告: (程序名称).exe-系统错误 该程序无法启动,因为您的计算机中缺少API-MS-WIN-CORE PROCESSENVIRONMENT-L1-2-0.dll.尝试重新安装程序以解决此问题. 确定 这是出乎意料的.先前的构建使用V140.两种构建都使用10.0.15063.0 SDK. Winver和_WIN32_WINNT一样,在命令行上设置为0x0601,因此我希望不会发生任何不良的事情.运行依赖.exe调查依赖项产生以下内容: 右侧的窗格显示了用V140建造的结果,左侧的窗格显示了用V142建造的结果.如您所见,它们都绑定到同一运行时,并且缺少的DLL绑定到Nothe Exotic:第一个项目正在寻找GetCommandLineW和GetCurrentDirectoryW. . 解决方案 您似乎正在反对 与Window
我已经看过 this 在GCC的较旧版本中,关于模拟__builtin_unreachable的问题.我的问题就是这样,但对于Visual Studio(2019)而言. Visual Studio是否等效于__builtin_unreachable?可以模拟它吗? 解决方案 MSVC具有其他解决方案 顺便说一下,#ifdef __GNUC__ // GCC 4.8+, Clang, Intel and other compilers compatible with GCC (-std=c++0x or above) [[noreturn]] inline __attribute__((always_inline)) void unreachable() {__builtin_unreachable();} #elif defined(_MSC_VER) // MSVC [[noreturn]] __forceinline void unreachable() {__assum
我有一个小的游戏引擎,在调试或发行模式下构建时,我需要定义一些自定义宏. 这是我的Cmake脚本的几行,应该这样做: if (CMAKE_BUILD_TYPE STREQUAL "Debug") set(OE_BUILD_TYPE_DEFINE "OE_DEBUG") endif() if (CMAKE_BUILD_TYPE STREQUAL "Release") set(OE_BUILD_TYPE_DEFINE "OE_RELEASE") endif() if (CMAKE_BUILD_TYPE STREQUAL "RelWithDebInfo") set(OE_BUILD_TYPE_DEFINE "OE_DEBUG") endif() if (CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") set(OE_BUILD_TYPE_DEFINE "OE_RELEASE") endif() targe
如今,我正在摆弄针对适合我需求的反射的数据模型的项目研究. 当我以G ++最近稳定版本的G ++版本运行时,我在Visual Studio 19中失败了.太糟糕了,因为后者是我的主要平台…… 有效地,我尝试将一个指针存储在另一个静态成员变量中.因此,我确实希望这样做(适合我的更大概念). . 我将失败的细节减少到以下MCVE: struct Field { }; struct Class { template struct BuiltInInfoT { Field CLASS::*const pField; // member pointer }; }; struct Object: Class { Field field1; static inline BuiltInInfoT field1BuiltInfo = { &Object::field1 }; }; int m
现在,我不会期望,在"升级"到编译器的"较新"版本之后. 在VS2017 std ::文件系统中,可以通过std ::实验::文件系统获得,现在升级到VS2019后,我感到惊讶的是,根本不可用.不在std ::实验或std ::文件系统中. 是的,我尝试从项目的设置中设置C ++ 17,甚至是"最新草稿"的事物,任何想法吗? 解决方案 为了完整性和将来的人们搜索. 要切换到Visual Studio中的C ++ 17'STD ::文件系统(无论VS2019或VS2017),您需要: 在项目属性中更改语言标准 - >配置属性 - > c/c ++ - >语言 - > C ++语言标准至少 ISO C ++ 17标准(/std: C ++ 17) (也可以在项目属性 - >配置属性 - >常规 - > C ++语言标准) 中找到 更改#include #include 更改源代
我有一个由Visual Studio 2019开放的CMAKE项目.我需要C ++ 17个功能,因此我已经在CMakeLists.txt 中设置了相应的标志 cmake_minimum_required (VERSION 3.10.0) project (datalog) message (STATUS "Building project ${PROJECT_NAME}") find_package(stxxl CONFIG REQUIRED) include_directories (${CMAKE_SOURCE_DIR}/src) set (PROJECT_SRC main.cpp ) add_executable (${PROJECT_NAME} ${PROJECT_SRC}) target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17) target_link_libraries(${PROJEC
我问了一系列与以下顺序相同的源代码有关的问题: 实验-Within-a结构和策略 -bits-in-stdbitset 避免 - 我还问了有关代码审查的这些系列问题,这些问题也与之相关. 模仿 - 经验 - 与Unions-bitfields结构和网板特殊化 仿真 - virtual-registers-part-part-part-part-2 这应该为您概述我的原始代码设计,并在那里供参考和背景信息.从那以后,我开始查看我的工作代码,并希望更简化它. 我决定删除模板的专业知识,并默认情况下,我的寄存器类是64位而不是8位,同时专注于高阶尺寸寄存器. 我正在尝试结合一个可以以任何这些方式访问数据的想法: 全价: - 整个64位qWord 一半值:-2个个人32位DWORDS 季度值-4个个人16位单词 第八值 - 8个人8位字节 以及通过实用程序的使用std::bitset可以轻松访问整个64位寄存器中的任何位.通过使用工会,