我认为c ++概念是编写具有更好的错误消息和更快的编译时间的c ++模板代码的更好方法,因此我将Visual Studio升级到2019,但仍在等待clang支持概念。]
但是我用Visual Studio 2019中的msvc和mingw-w64中的g ++ 8测试了一些简单的代码,但遇到了一些麻烦。
这是测试:
#include <iostream> using namespace std; // this compiles under g++ 8 but not visual studio 2019 template <class T> bool concept CharT = std::is_same_v<T, char> || std::is_same_v<T, wchar_t> || std::is_same_v<T, char16_t> || std::is_same_v<T, char32_t>; // this compile under visual studio 2019 but not g++ //template <class T> //concept CharT = std::is_same_v<T, char> || std::is_same_v<T, wchar_t> || // std::is_same_v<T, char16_t> || std::is_same_v<T, char32_t>; template <CharT char_type> void PrintChar(char_type ch) { wcout << ch << endl; } int main() { PrintChar('c'); PrintChar(L'h'); PrintChar('a'); PrintChar('r'); }
Visual Studio调用:
cl /std:c++latest concepts.cpp Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28316 for x64 Copyright (C) Microsoft Corporation. All rights reserved. /std:c++latest is provided as a preview of language features from the latest C++ working draft, and we're eager to hear about bugs and suggestions for improvements. However, note that these features are provided as-is without support, and subject to changes or removal as the working draft evolves. See https://go.microsoft.com/fwlink/?linkid=2045807 for details. concepts.cpp concepts.cpp(7): error C2988: unrecognizable template declaration/definition concepts.cpp(7): error C2059: syntax error: 'concept' concepts.cpp(7): fatal error C1903: unable to recover from previous error(s); stopping compilation Internal Compiler Error in C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.24.28314\bin\HostX64\x64\cl.exe. You will be prompted to send an error report to Microsoft later.
g ++调用
g++ -std=c++2a -fconcepts concepts.cpp -o c.exe concepts.cpp:12:9: error: 'CharT' does not name a type; did you mean 'char'? concept CharT = std::is_same_v<T, char> || std::is_same_v<T, wchar_t> || ^~~~~ char concepts.cpp:15:11: error: 'CharT' has not been declared template <CharT char_type> ^~~~~ concepts.cpp:16:16: error: variable or field 'PrintChar' declared void void PrintChar(char_type ch) ^~~~~~~~~ concepts.cpp:16:16: error: 'char_type' was not declared in this scope concepts.cpp:16:16: note: suggested alternative: 'wchar_t' void PrintChar(char_type ch) ^~~~~~~~~ wchar_t concepts.cpp: In function 'int main()': concepts.cpp:23:2: error: 'PrintChar' was not declared in this scope PrintChar('c'); ^~~~~~~~~
应该支持这两种语法吗?还是我在一个编译器中使用了已弃用或删除的语法,而另一个编译器不支持该语法?
我认为c ++概念是编写具有更好的错误消息和更快的编译时间的c ++模板代码的更好方法,因此我将Visual Studio升级到2019,但仍在等待clang支持...
bool
的语法是不是
C ++ 20概念,但是是以前的Concepts TS(技术规范)的语法。后者是对C ++ 17的实验性扩展,被基于TS的C ++ 20概念添加所取代,但对语法和语义进行了一些更改。