草庐IT

c++ - 当模板template-parameter的模板参数为pack expansion时,gcc失败,clang成功

templatestructS{templatestructA{};templatestructB{};templateclass>structC{};};S::C::B>s1;S::C::A>s2;//gcc5.1.0fails,clang3.6.0succeedsintmain(){}你可以在这里测试http://melpon.org/wandbox/permlink/hhy70gO9LMjLq9nU哪个是正确的,gcc还是clang? 最佳答案 这个问题在gcc6.0中已经解决 关

c++ - 我是否在简单的 OpenMP for 循环中误用了引用变量,还是 clang 错误?

我想我发现了一个clang++错误,但希望就我的代码是否正确提出建议。Clang静态分析器认为它没问题,并且编译没有问题,但是当使用clang3.7编译时,它从传递的引用vector中获取的大小完全错误。GCC和clang3.8都给出了正确的答案。我已将其简化为这个测试用例:#include#include//includingorexcludingompmakesnodifference#includevoiddoSomething(std::vector&k){#pragmaompforfor(inti=0;iv;v.push_back(1);std::vector&j=v;doS

c++ - 是否允许编译器优化堆内存分配?

考虑以下使用new的简单代码(我知道没有delete[],但它不属于这个问题):intmain(){int*mem=newint[100];return0;}是否允许编译器优化new调用?在我的研究中,g++(5.2.0)和VisualStudio2015不优化new调用,whileclang(3.0+)does.所有测试都是在启用完全优化的情况下进行的(-O3用于g++和clang,用于VisualStudio的Release模式)。new不是在幕后进行系统调用,使得编译器不可能(并且非法)对其进行优化吗?编辑:我现在已经从程序中排除了未定义的行为:#includeintmain()

c++ - std::future.get() 有时卡在 os x 中

我有两个线程,一个线程应该接收和处理来自另一个线程的请求。第二种是同步传输请求和接收响应。我尝试了以下方案:成对队列(值(value),promise)。第一个线程创建一个promise并将其插入同步队列并等待future.get()的返回值问题是有时线程卡在future.get()上,但是当我暂停程序执行并继续时它再次正常工作。这个stucks具有随机​​性。FutureQueue.h#ifndefFutureQueue_h#defineFutureQueue_h#include#include#include#include#includetemplateclassWork{pub

c++ - clang:没有外联虚方法定义(纯抽象 C++ 类)

我正在尝试使用Clang-3.5编译以下简单的C++代码:测试.h:classA{public:A();virtual~A()=0;};测试.cc:#include"test.h"A::A(){;}A::~A(){;}我用于编译的命令(Linux,uname-r:3.16.0-4-amd64):$clang-3.5-Weverything-std=c++11-ctest.cc我得到的错误:./test.h:1:7:warning:'A'hasnoout-of-linevirtualmethoddefinitions;itsvtablewillbeemittedineverytransl

c++ - g++ 和 clang++ 变量模板和 SFINAE 的不同行为

另一个类型的问题“g++和clang++之间谁是正确的?”适用于C++标准专家。假设我们想将SFINAE应用于变量模板,以便仅当模板类型满足特定条件时才启用该变量。例如:当(且仅当)模板类型具有具有给定签名的foo()方法时,启用bar。通过具有默认值的附加模板类型使用SFINAEtemplatestaticconstexprintbar=1;适用于g++和clang++但有一个问题:可以劫持解释第二个模板类型所以inti=bar;给出一个编译错误inti=bar;编译没有问题。因此,出于对SFINAE的无知,我尝试启用/禁用同一变量的类型:templatestaticconstexp

c++ - 静态 std::stringstream 的 Clang-tidy 警告

我有以下MCVE:#includestructA{staticstd::stringstreams;};std::stringstreamA::s;intmain(){}当我在此代码上运行clang-tidy6.0.1时,我收到以下警告:static_sstream.cpp:7:22:warning:initializingnon-localvariablewithnon-constexpressiondependingonuninitializednon-localvariable'out'[cppcoreguidelines-interfaces-global-init]std::

c++ - 使用数组作为元组成员 : Valid C++11 tuple declaration?

下面的代码可以在G++4.7.2中正常编译:#includestd::tuplex;但是,使用clang++3.2会产生以下错误:错误:数组初始化器必须是一个初始化器列表。如果我从元组声明中删除float类型,错误就会消失。上面的元组声明是否有效?($CXX-std=c++11-c文件.cpp) 最佳答案 我认为标准中没有任何内容禁止您的声明。但是,一旦尝试初始化、复制、移动或分配元组,就会遇到问题,因为对于这些操作,元组的所有成员类型都必须能够用作初始化器、可复制构造、可复制分配和移动分配,分别(§20.4.2.1)。这些都不是数

c++ - 带有 clang 的 OpenMP

我正在尝试使用中指定的clang编译器编写openmp代码http://clang-omp.github.io/我通过git下载代码并执行了make和makeinstall。它成功安装了支持openmp的clang编译器。但是当我尝试编译示例代码(在上面的链接中指定)时,出现以下错误:/usr/bin/ld:找不到-liomp5我没有指定站点中提到的包含路径和lib,但我打算在使用-L和-I选项在命令行上编译时指定它们.$clang-I/usr/lib/gcc/i686-linux-gnu/4.6/include-fopenmptest.c-otest但是,我找不到iomp5库的路径,

c++ - 在 clang++ 中按值怪异传递抽象对象

为什么clang++3.6编译了下面的代码(g++没有)?classAbc{public:virtualvoidfoo()const=0;virtual~Abc(){}};//iscorrectlyrejected//voidbar(Abco)//{//}classB{voidbar(Abco)//shouldalsoberejected{}};intmain(){}我使用的是clang3.6和gcc4.9.2。为什么自由函数(正确地)被拒绝而成员函数却没有?有什么提示吗?clang中的错误?如果我将上面的修改为:classAbc{public:virtualvoidfoo()cons