草庐IT

c++ - Clang 与 GCC 与 MSVC 中的 SFINAE 和可见性检查——哪个是正确的?

我已经写了我对is_default_constructible的C++03兼容实现的尝试:templatestructis_default_constructible;templatestructis_default_constructible{protected://Putbasetypedefsheretoavoidpollutionstructtwoc{chara,b;};templatestructtest{typedefchartype;};templatestaticTdeclval();};templatestructis_default_constructible::t

c++ - 为什么 MSVC 的自动矢量化不使用 AVX2?

我正在尝试在我的编译器(MicrosoftVisualStudio2013)中使用矢量化。我面临的问题之一是它不想使用AVX2。在研究这个问题时,我构建了以下示例,该示例计算16个数字的总和,每个数字都是16位。int16_tinput1[16]={0};int16_tinput2[16]={0};...//fillthearrayswithsomedata//Calculatethesumusingaloopint16_toutput1[16]={0};for(intx=0;x编译器将此代码矢量化,但仅限于SSE指令:vmovdquxmm1,xmmwordptr[rbp+rax]le

c++ - enable_if + std::less + sizeof... 的组合使 MSVC 失败

这是一个非常简单的代码:template()(sizeof...(Args),3),int>::type*=nullptr>voidtest(std::tuple){}intmain(){test(std::make_tuple(1,2));}它只是简单的函数模板,带有一些enable_if健康)状况。(进一步的SFINAE)。但是它无法在VisualStudio2019withC++17设置中编译。errorC2672:'test':nomatchingoverloadedfunctionfounderrorC2783:'voidtest(std::tuple)':couldnotd

c++ - std::put_time 的 MSVC 实现

我正在使用MicrosoftVisualStudio2012,并且正在考虑使用std::put_time,因此我创建了以下示例:intmain(){std::time_tt=std::chrono::system_clock::to_time_t(std::chrono::system_clock::now());std::locale::global(std::locale("en-GB"));std::cout这会产生以下输出:06/25/2013这不是我期望的en-GB语言环境的日期格式。我也试过:std::cout.imbue(std::locale("en-GB"));但是,

c++ - MSVC2015 更新 3 可变参数模板解决方法

VisualStudio2015update3改进了对C++11的支持,但我遇到了一个奇怪的问题,我正在寻找解决方法。当使用MSVC为模板类型参数(“完全定义的类型”)编译可变参数模板代码时,一切正常,但如果我想使用模板模板参数(“部分定义的类型”),结果就会变得不正确。#includeusingnamespacestd;templateclass...TS>structPARTIAL{staticvoidtest(std::ostream&out){outclassT>structPARTIAL{staticvoidtest(std::ostream&out){outclassT,t

c++ - 如何让 MSVC 将未初始化的数据放入 .bss?

我正在使用自定义构建系统(在VisualStudio之外)构建DLL,但我无法让未初始化的数据显示在.bss部分中;编译器将其合并到.data中。这会膨胀最终的二进制大小,因为它充满了巨大的零数组。例如(示例中的1KB小数组,但实际缓冲区要大得多):intuninitialized[1024];intinitialized[1024]={123};编译器像这样发出程序集:PUBLIC_initialized_DATASEGMENTCOMM_uninitialized:DWORD:0400H_initializedDD07bHORG$+4092_DATAENDS最终在目标文件中是这样的:

c++ - MSVC 与 GCC 与 sizeof 的行为不一致

考虑以下代码:#includeclassA{public:structB{intM;};staticvoidStaticFunc();};voidA::StaticFunc(){conststd::size_ts0=sizeof(::A::B::M);conststd::size_ts1=sizeof(A::B::M);conststd::size_ts2=sizeof(B::M);}intmain(){conststd::size_ts3=sizeof(A::B::M);return0;}GCCcompilesit,只是警告未使用的变量。但是VisualC++2015无法编译它:er

c++ - 使用 MSVC 2013 初始化 `static constexpr double`

标题说明了一切,两种常用方法都行不通。我错过了什么?1.classCl{staticconstexprdoublePI;};constexprdoubleCl::PI=3.14;(26):errorC2737:'private:staticdoubleconstCl::PI':'constexpr'objectmustbeinitialized2.classCl{staticconstexprdoublePI=3.14;};(26):errorC2864:'Cl::PI':astaticdatamemberwithanin-classinitializermusthavenon-vol

c++ - 从 std::string_view 派生的对象的比较在 MSVC 中不明确

长话短说:我是否可以期望下面的代码可以在任何符合c++17的c++工具链(基于当前的c++17提案)上编译,而MSVC的失败是它们实现中的错误?#includestructFoo:std::string_view{};intmain(){Foof1{};Foof2{};returnf1==f2;}解释:我有一个派生自std::string_view的类,它没有实现自己的比较运算符,因为std::string_view语义正是我所需要的,而且我也希望它可以与例如一个std::string。但是,如果我尝试比较该类的两个实例,MSVC2017会提示具有类似转换的多个重载:example.c

c++ - MSVC - 停止标题中的警告

我在CMake项目中使用MSVC。因此,我在MSVC上启用了许多为gcc和clang启用的标志。但是,/Wall警告级别让我有些痛苦;它会警告我包含header中的各种内容,例如stdio.h和boostheader。有没有办法阻止MSVC警告我标题中的内容?我喜欢我的警告级别,但我只想为我启用它们。 最佳答案 /Wall非常迂腐。/W4可能就是您真正需要的。要回答您的问题,您可以禁用header周围的特定警告:#pragmawarning(disable:xxxx)#include#pragmawarning(default:xx