Clang有一个很好的页面描述了C++ 1z/C++ 17特性支持的项目状态(以及C++ 11和C++ 14,它是同一页面).
g ++有一个关于C++ 14特性的页面,但我找不到任何关于C++ 17/C++ 1z的内容.这是否正在进行,但只是没有出现在网络上?对于5.0版?
码:
#include<iostream>
using namespace std;
int main()
{
size_t i = sizeof new int;
cout<<i;
}
Run Code Online (Sandbox Code Playgroud)
在GCC编译器中,工作正常,没有任何警告或错误和打印输出8.
但是,在clang编译器中,我收到了以下警告:
warning: expression with side effects has no effect in an unevaluated context [-Wunevaluated-expression]
size_t i = sizeof new int;
Run Code Online (Sandbox Code Playgroud)
sizeof new int;未定义的行为?对于这个简化的测试用例:
#include <map>
class Tester {
int foo;
std::map<int, int> smap;
};
int main() {
Tester test;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我得到以下编译器警告:
$ clang++ -std=c++98 -Weverything test.cc
test.cc:5:24: warning: padding class 'Tester' with 4 bytes to align 'smap' [-Wpadded]
std::map<int, int> smap;
^
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释这个警告意味着什么,以及我应该如何解决它?
这段代码与gcc/g ++和msvc完全兼容,但与clang无关.它一直抱怨没有找到Log的匹配功能,发生了什么?
#include <iostream>
template <typename Function, typename... Args>
auto Call(Function func, Args&&... args) -> typename std::result_of<Function&(Args&&...)>::type
{
return func(std::forward<Args>(args)...);
}
template <typename T, typename... Args>
T (*Log( T (*FuncPtr)(Args...) ))(Args...)
{
return FuncPtr;
}
int main()
{
auto r = Log(Call<int(int), int>)([](int x){
return x*10;
}, 10);
std::cerr << r << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
错误:
> error: no matching function for call to 'Log'
> auto r = Log(Call<int(int), int>)([](int x){
> ^~~ test7.cpp:15:5: note: candidate template ignored: couldn't infer …Run Code Online (Sandbox Code Playgroud) 我一直在尝试使用std::formatC++20中包含的函数。据我所知,clang 14 应该支持此功能,但由于某种原因我收到以下错误:no member named 'format' in namespace 'std'。根据cppreference 的编译器支持图表,clang 应该支持文本格式,但我仍然收到此错误。我不知道问题是什么。
我希望使用-fsanitize=memoryclang中的标志来分析如下的程序:
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
void writeToFile(){
ofstream o;
o.open("dum");
o<<"test"<<endl; //The error is here.
//It does not matter if the file is opened this way,
//or with o("dum");
o.close();
}
int main(){
writeToFile();
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这个程序是正确的,但是当我使用clang++ san.cpp -fsanitize=memory它时失败(在运行时):
UMR in __interceptor_write at offset 0 inside [0x64800000e000, +5)
==9685== WARNING: MemorySanitizer: use-of-uninitialized-value
#0 0x7f48d0899ae5 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x7bae5)
#1 0x7f48d08d1787 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0xb3787)
#2 0x7f48d08d21e2 (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0xb41e2)
#3 0x7f48d08cfd1e (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0xb1d1e)
#4 0x7f48d08b1f2d (/usr/lib/x86_64-linux-gnu/libstdc++.so.6+0x93f2d)
#5 0x7f48d16d60f5 in writeToFile() /home/daniel/programming/test/santest.cpp:10 …Run Code Online (Sandbox Code Playgroud) 这段代码不能在 Clang (6,7,8,9,trunk) 中编译,但在 GCC (7.1, 8.1, 9.1) 中编译得很好:
template<class T> struct TypeHolder { using type = T; };
template<int i>
class Outer {
private:
template<class T>
static constexpr auto compute_type() {
if constexpr (i == 42) {
return TypeHolder<bool>{};
} else {
return TypeHolder<T>{};
}
}
public:
template<class T>
using TheType = typename decltype(Outer<i>::compute_type<T>())::type;
};
int main() {
Outer<42>::TheType<int> i;
}
Run Code Online (Sandbox Code Playgroud)
叮当告诉我:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
Run Code Online (Sandbox Code Playgroud)
......这当然是,但我尝试访问该成员中同一类。我不明白为什么它不应该在那里访问。我是否遇到了(我应该提交)Clang 错误?
您可以在Godbolt 的编译器资源管理器中 …
我正在尝试使用clang ++编译器在OS X 10.8上编译一些C++代码(包括C++ 11特性).我有一个生成目标文件的makefile,然后在命令上:
clang++ -o Analysis.so -shared DataFile.o CR39DataFile.o
Run Code Online (Sandbox Code Playgroud)
关于架构x86_64找不到符号,我收到很多错误.该代码在使用g ++的*nix系统上正常工作,并适当地更改编译器标志以支持C++ 11.要编译*.o我这样做:
clang++ -c -Wall -std=c++11 -stdlib=libc++ -I../src ../src/DataFile.cc
Run Code Online (Sandbox Code Playgroud)
编辑:链接命令的输出是:
clang++ -o Analysis.so -shared DataFile.o CR39DataFile.o
Undefined symbols for architecture x86_64:
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find(char const*, unsigned long, unsigned long) const", referenced from:
CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in CR39DataFile.o
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::find(char, unsigned long) const", referenced from:
CR39DataFile::trim(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in CR39DataFile.o
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::compare(char const*) const", referenced from:
CR39DataFile::read_thread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >) in CR39DataFile.o …Run Code Online (Sandbox Code Playgroud) 我遇到了一个奇怪的情况,alignof(__m512)它不等于std::alignment_of<__m512>::value由 Apple 的 clang 编译。经过一些测试,我发现当alignof(T)在模板中使用 进行评估时T=__m512,结果与直接不同alignof(__m512)。我还在 ubuntu(WSL) 上运行了几个由 g++ 和非 Apple 的 clang 编译的测试,并得到了正确的(我认为)行为。这是Apple的clang错误还是有关实施行为的问题?
#include <immintrin.h> //avx headers
#include <cstdio>
#include <typeinfo>
#include <type_traits>
void test_directly() {
printf("directly: typeid %s alignof %zu\n", typeid(__m512).name(), alignof(__m512));
}
template<typename T>
void test_as_template_argument() {
static_assert(std::is_same<T, __m512>::value, "assert");
printf("template: typeid %s alignof %zu\n", typeid(T).name(), alignof(T));
}
int main() {
test_directly();
test_as_template_argument<__m512>();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出(编译clang++ -std=c++17 -march=native):
directly: typeid Dv16_f alignof 64
template: …Run Code Online (Sandbox Code Playgroud) flutter runLinux 桌面应用程序出现此错误
Running "flutter pub get" in proj... 5.3s\nLaunching lib/main.dart on Linux in debug mode...\nCMake Error at /usr/share/cmake-3.22/Modules/CMakeTestCXXCompiler.cmake:62 (message):\n The C++ compiler\n\n "/usr/bin/clang++"\n\n is not able to compile a simple test program.\n\n It fails with the following output:\n\n Change Dir: /media/kingbob/Dvolve/EData/proj/build/linux/x64/debug/CMakeFiles/CMakeTmp\n\n Run Build Command(s):/usr/bin/ninja cmTC_5f1b6 && [1/2] Building CXX object CMakeFiles/cmTC_5f1b6.dir/testCXXCompiler.cxx.o\n [2/2] Linking CXX executable cmTC_5f1b6\n FAILED: cmTC_5f1b6 \n : && /usr/bin/clang++ CMakeFiles/cmTC_5f1b6.dir/testCXXCompiler.cxx.o -o cmTC_5f1b6 && :\n /usr/bin/ld: cannot find -lstdc++: No such file or directory\n clang: …Run Code Online (Sandbox Code Playgroud)