Visual Studio 2019拒绝`bool concept`,而gcc 8不会在没有`bool`的情况下编译概念 [英] Visual Studio 2019 rejects `bool concept` while gcc 8 doesn't compile concepts without `bool`

查看:122
本文介绍了Visual Studio 2019拒绝`bool concept`,而gcc 8不会在没有`bool`的情况下编译概念的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I thought c++ concepts is a better method to write c++ templated code with better error messages and faster compile times , so I upgraded Visual Studio to 2019 and still waiting for clang to support concepts

但是我用Visual Studio 2019中的msvc和mingw-w64中的g ++ 8测试了一些简单的代码,但遇到了一些麻烦.

however I tested some simple code with msvc from visual studio 2019 and g++ 8 from mingw-w64 and I'm having some trouble.

这是测试:

#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调用:

Visual Studio invocation :

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');
  ^~~~~~~~~

是否应支持这两种语法?还是我在一个编译器中使用了已弃用或删除的语法,而另一个编译器不支持该语法?

should the two syntax be supported ? or I'm using a deprecated or removed syntax with one compiler while the other doesn't support it ?

推荐答案

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

The syntax with bool is not C++20 concepts, but the syntax of the previous Concepts TS (Technical Specification). The latter is an experimental extension to C++17, superseded with C++20 concepts additions which are based on the TS, but made some changes to syntax and semantics.

GCC 8仅支持TS,不支持C ++ 20概念,后者需要GCC 10.

GCC 8 only supports the TS, not C++20 concepts, you need GCC 10 for the latter.

有关C ++的文档,请参见此cppreference.com页面.为Concepts TS添加了20个概念,并.另请参见此页面,以获取对概念(TS和C ++)的编译器支持的列表.20).

See this cppreference.com page for documentation of the C++20 concepts additions and this one for the Concepts TS. See also this page for a list of compiler support for concepts (TS and C++20).

这篇关于Visual Studio 2019拒绝`bool concept`,而gcc 8不会在没有`bool`的情况下编译概念的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆