首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual 2019拒绝“concepts”,而gcc 8不编译没有“`bool”的概念。

Visual 2019拒绝“concepts”,而gcc 8不编译没有“`bool”的概念。
EN

Stack Overflow用户
提问于 2020-03-14 15:11:32
回答 2查看 854关注 0票数 0

我认为c++概念是编写c++模板代码的更好方法,具有更好的错误消息和更快的编译时间,因此我将Visual升级到2019年,并且仍然在等待clang支持概念。

然而,我用visual 2019和g++ 8的msvc测试了一些简单的代码,这些代码来自明明威64,我遇到了一些麻烦。

这是一个考验:

代码语言:javascript
复制
#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调用:

代码语言:javascript
复制
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++调用

代码语言:javascript
复制
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');
  ^~~~~~~~~

应该支持这两种语法吗?或者,我在一个编译器中使用不推荐的或删除的语法,而另一个编译器不支持它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-14 15:24:37

bool的语法不是C++20概念,而是以前概念TS (技术规范)的语法。后者是对C++17的实验性扩展,取代了基于TS的C++20概念添加,但对语法和语义进行了一些更改。

GCC 8只支持TS,不支持C++20的概念,你需要GCC 10为后者。

有关C++20概念添加的文档,请参阅C++20,概念TS的这一个。还请参阅此页以获得编译器对概念(TS和C++20)的支持列表。

票数 4
EN

Stack Overflow用户

发布于 2020-03-14 15:40:11

正如胡桃所说,concept bool是TS语法,而concept是C++20语法。

如果确实需要同时支持这两种编译器,则可以使用特征测试宏来选择正确的语法(尽管从技术上讲,该表中没有列出概念TS ):

代码语言:javascript
复制
#if __cpp_concepts >= 201707
  // working paper, C++20 concepts
  #define CONCEPT concept
#else
  // TS
  #define CONCEPT concept bool
#endif

template <typename T>
CONCEPT C = true;

这将适用于所有支持概念的编译器。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60684179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档