在StackOverflow上查看我在使用C++ 11标准时发现在Clang ++上,如果已经为您的类定义了一个移动构造函数,则隐式构造函数生成被禁用,即复制构造函数被"删除已删除".
有没有办法禁用这种行为?
此外,这种行为是否标准化?因为我在GCC中没有相同的行为.
我是C++的新手.我试图在clang 3.4中用"-std = c ++ 11 -stdlib = libc ++"标志编译一个非常简单的std :: map progeam,我得到了一些我不明白的错误.
#include<map>
#include<string>
template<typename KeyType>
struct ReverseSort {
bool operator() (const KeyType& key1, const KeyType& key2) {
return (key1 > key2);
}
};
int main() {
using namespace std;
map<int, string> mapIntToString1;
map<int, string, ReverseSort<int> > mapIntToString4(mapIntToString1.cbegin(), mapIntToString1.cend());
return 0;
}
Run Code Online (Sandbox Code Playgroud)
错误是:
map:457:17: error: no matching function for call to object of type 'const ReverseSort<int>'
Run Code Online (Sandbox Code Playgroud)
我知道错误来自main()中的第3行,只是不明白为什么.同样的程序在g ++ 4.8.2中带有"-std = c ++ 11"标志,我相信它在VC2010中也很好.
谢谢.
这是一个非常简单的C++程序.
// test.h
class Test {
public:
Test();
};
// test.cpp
#include "test.h"
Test::Test()
{
// do something
}
// main.cpp
#include "test.h"
int main() {
Test t;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试图使用此命令行在OSX上使用clang ++编译它,我收到此错误:
[test]$ clang++ main.cpp -o main
Undefined symbols for architecture x86_64:
"Test::Test()", referenced from:
_main in main-017149.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
这是使用-v开关的编译:
[test]$ clang++ main.cpp -o main -v
Apple …Run Code Online (Sandbox Code Playgroud) 我想传递lambdas,所以我定义了一个这样的函数:
double getInput(std::string inputDescription, std::function<bool(double)> isValid) { ... }
Run Code Online (Sandbox Code Playgroud)
但是gcc拒绝编译它.我很快就知道我需要一个支持C++ 11的编译器,所以我用MacPorts下载了clang 3.5.我找到了clang ++并确认它是正确的版本(我并没有意外地使用原来的clang 1.7):
$ /opt/local/bin/clang++ --version
clang version 3.5.0 (trunk 210448)
Target: x86_64-apple-darwin10.8.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)
但即使是Clang 3.5也给了我:
tempConverter.cpp:14:52: error: no type named 'function' in namespace 'std'
double getInput(std::string inputDescription, std::function<bool(double)> isValid) {
~~~~~^
Run Code Online (Sandbox Code Playgroud)
完整的.cpp文件:
#include <iostream>
#include <cmath>
#include <iomanip>
#include <functional>
#include <string>
static const double minTemp = -273.15;
static const double maxTemp = 500.0;
inline bool between(double x, double min, double max) {
return min <= …Run Code Online (Sandbox Code Playgroud) 因此,我创建了一个使用递归来反转链表的函数。我的反向函数工作正常,但是当我尝试在可执行文件上运行 asan 时,它在反向函数的特定地址处给出了堆栈溢出错误。我已尝试一切方法来修复它。我试图在完成工作后将堆栈中的所有变量设为 NULL。我已经从堆中取消分配了所有内存。我对文件运行 valgrind,它告诉我所有内存已被释放并且没有泄漏。我该怎么办?
PS 我在 C++ 中使用 clang++ 编译器。
在我的代码中,我有一个带bool value模板参数的函数.除了一行之外,在true和false案例中函数的实现几乎完全相同.所以我想我会if(value)发表一个声明,以避免重写相同的函数两次.调用函数时,value在编译时确定,因此if语句缩减为a if(true)或a if(false).现在,我想知道:这是安全的假设,任何合理的编译器(比如说g++,clang++...)将优化这种说法?
是的,性能至关重要,是的,功能非常轻巧,因此即使是单一的if也会影响速度,是的,这个功能需要在许多人类赖以生存的实时设备上执行数万次.
如果我使用clang 3.8.1编译:
extern "C" {
int foo(int x) { register int y = x; return y; }
}
int main() { return foo(123); }
Run Code Online (Sandbox Code Playgroud)
我收到警告:
a.cpp:3:18: warning: 'register' storage class specifier is deprecated and incompatible with C++1z [-Wdeprecated-register]
int foo(int x) { register int y = x; return y; }
^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
...我真的不应该得到,因为内部函数是C代码.如果我使用GCC 6.3.1,即使有-Wall,我也不会收到此警告.
这是一个铿锵的错误还是我做错了什么?
我有一些 C++ 代码,我可以在其中切换枚举中的值。我试图用 -Wall -Wextra -Werror 编译它。这在使用 clang 时很好。但是,GCC 抱怨未涵盖默认代码路径。简化版本如下所示:
enum class Types: int {
A,
B,
C
};
bool some_logic(Types val) {
switch (val) {
case Types::A:
return (false);
case Types::B:
return (true);
case Types::C:
return (false);
}
}
Run Code Online (Sandbox Code Playgroud)
我可以通过在函数末尾添加一个 default case 或另一个 return 语句来处理这个问题。但是,我的问题是为什么 GCC 没有检测到枚举的所有情况都已涵盖?或者换一种说法,海湾合作委员会在这里抱怨是否有正当理由?
我在此处对编译器输出进行了比较。
以下尝试包装 lambda 的(简化)代码向我提供了一些 Clang 版本的警告,但不是全部,也不是 gcc。
template<typename Lambda>
auto wrapLambda(Lambda lambda)
{
return [&lambda]() {
lambda();
};
}
auto wrappedLambda = wrapLambda([](){ return 0; });
Run Code Online (Sandbox Code Playgroud)
warning: address of stack memory associated with parameter 'lambda' returned [-Wreturn-stack-address]
return [&lambda]() {
^~~~~~
Run Code Online (Sandbox Code Playgroud)
这是一个错误,还是我错过了什么?我x86-64 clang (trunk)在Godbolt 中收到警告,并clang version 11.1.0作为更大的回购的一部分,但我无法隔离该版本的故障。
这个相关问题中的例子没有给出警告。
改进(我认为)版本:
template<typename Callable>
auto wrapCallable(Callable&& callable)
{
return [callable = std::forward<Callable>(callable)]() {
callable();
};
}
auto wrappedCallable = wrapCallable([](){ return 0; });
Run Code Online (Sandbox Code Playgroud)
这沉默的警告与x86-64 clang (trunk) …
以下是代码:
#include <iostream>
const int& temp_func() {
return 3;
}
int main() {
std::cout << temp_func() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
用g++编译时(Ubuntu 9.3.0-17ubuntu1~20.04),结果:
[1] 402809 segmentation fault ...
Run Code Online (Sandbox Code Playgroud)
另一方面,当使用 clang++-12 编译时,结果:
3
Run Code Online (Sandbox Code Playgroud) c++ ×10
clang++ ×10
c++11 ×4
clang ×3
g++ ×2
extern-c ×1
gcc ×1
gcc-warning ×1
lambda ×1
macos ×1
multilingual ×1
optimization ×1