草庐IT

c++ - 如何在 CMake 中启用 C++17

我使用的是支持集成CMake3.8的VS15.3。如何在不为每个特定编译器编写标志的情况下以C++17为目标?我当前的全局设置不起作用:#https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.htmlset(CMAKE_CXX_STANDARD17)set(CMAKE_CXX_STANDARD_REQUIREDON)set(CMAKE_CXX_EXTENSIONSOFF)#expectedbehaviour#set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}/std:c++latest")我希望CM

c++ - std::visit 的 C++17 示例中令人困惑的模板

在cppreference中查看std::visit()页面时,https://en.cppreference.com/w/cpp/utility/variant/visit,遇到了看不懂的代码……这是缩略版:#include#include#include#include#include#includetemplatestructoverloaded:Ts...{usingTs::operator()...;};templateoverloaded(Ts...)->overloaded;intmain(){std::vector>vec={10,15l,1.5,"hello"};fo

c++ - std::visit 的 C++17 示例中令人困惑的模板

在cppreference中查看std::visit()页面时,https://en.cppreference.com/w/cpp/utility/variant/visit,遇到了看不懂的代码……这是缩略版:#include#include#include#include#include#includetemplatestructoverloaded:Ts...{usingTs::operator()...;};templateoverloaded(Ts...)->overloaded;intmain(){std::vector>vec={10,15l,1.5,"hello"};fo

c++ - C++14 和 C++17 使用 : `*p++ = *p` 的区别

在编写一些代码时,我遇到了我设置的值设置错误的问题。我最终找到了罪魁祸首,在进行测试时发现它在C++14和C++17上的表现不同。代码如下:#include#include#includeintmain(){uint8_t*p=newuint8_t[3];memset(p,0x00,1);p++;memset(p,0xF0,1);p++;memset(p,0xFF,1);p--;p--;//Thislineinparticular*p++=*p;*p++=0x0F;p--;p--;printf("Position0hasvalue%u\n",*p);p++;printf("Positi

c++ - C++14 和 C++17 使用 : `*p++ = *p` 的区别

在编写一些代码时,我遇到了我设置的值设置错误的问题。我最终找到了罪魁祸首,在进行测试时发现它在C++14和C++17上的表现不同。代码如下:#include#include#includeintmain(){uint8_t*p=newuint8_t[3];memset(p,0x00,1);p++;memset(p,0xF0,1);p++;memset(p,0xFF,1);p--;p--;//Thislineinparticular*p++=*p;*p++=0x0F;p--;p--;printf("Position0hasvalue%u\n",*p);p++;printf("Positi

c++ - 为什么这个 "undefined extern variable"不会导致 C++17 中的链接器错误?

我已经在C++17编译器(Coliru)中编译并运行了以下程序。在程序中,我声明了一个extern变量,但没有定义它。但是,编译器不会给出链接器错误。#includeexterninti;//Onlydeclarationintfunc(){ifconstexpr(true)return0;elseif(i)returni;elsereturn-1;}intmain(){intret=func();std::cout为什么编译器不给出链接器错误? 最佳答案 因为变量没有被odr使用。你有一个constexprif总是丢弃可以使用它的

c++ - 为什么这个 "undefined extern variable"不会导致 C++17 中的链接器错误?

我已经在C++17编译器(Coliru)中编译并运行了以下程序。在程序中,我声明了一个extern变量,但没有定义它。但是,编译器不会给出链接器错误。#includeexterninti;//Onlydeclarationintfunc(){ifconstexpr(true)return0;elseif(i)returni;elsereturn-1;}intmain(){intret=func();std::cout为什么编译器不给出链接器错误? 最佳答案 因为变量没有被odr使用。你有一个constexprif总是丢弃可以使用它的

c++ - 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?

GCC4.x不接受C++14代码的--std=c++14开关-它需要--std=c++1y代替。更高版本采用--std=c++1z但(可能)不是--std=c++17尚未设置(在2016年编写).也许C++11也有类似的问题。CMake是否有一些工具(可能作为一个模块)来根据GCC版本传递正确的开关? 最佳答案 当想要指定特定的C++版本时,推荐使用CMake3.1及更高版本执行此操作的方法是使用CXX_STANDARD、CXX_STANDARD_REQUIRED和CXX_EXTENSIONS目标属性,或它们的变量等效项以指定目标默

c++ - 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?

GCC4.x不接受C++14代码的--std=c++14开关-它需要--std=c++1y代替。更高版本采用--std=c++1z但(可能)不是--std=c++17尚未设置(在2016年编写).也许C++11也有类似的问题。CMake是否有一些工具(可能作为一个模块)来根据GCC版本传递正确的开关? 最佳答案 当想要指定特定的C++版本时,推荐使用CMake3.1及更高版本执行此操作的方法是使用CXX_STANDARD、CXX_STANDARD_REQUIRED和CXX_EXTENSIONS目标属性,或它们的变量等效项以指定目标默

c++ - C++ 17中的静态constexpr和静态内联变量有什么区别?

在C++17中,我们得到内联变量。它们的用途之一是在类中定义常量字段。那么这两个常量定义有什么区别:classMyClass{staticconstexprintmyFirstVar=10;staticconstinlineintmySecondVar=100;};当然constexpr使myFirstVar隐式内联。这里有什么更好的选择,使用constexpr或inline?注意:当你不需要constness时,inline会更容易。使用constexpr你没有那个选择。 最佳答案 您不必在声明时为mySecondVar指定初始化