C ++ 17是2017年批准的C ++标准的名称。它基于以前的C ++ 14标准,改进了核心语言和标准库,并添加了一些新的语言功能。
问题是我在 Nicolai M. Josuttis 所著的《C++17 Complete Guide》一书中遇到了一段代码,第 122 页。该代码片段对我不起作用。我想知道为什么。 模板 问题是我在 Nicolai M. Josuttis 的一本名为 C++17 Complete Guide 的书中遇到了一段代码,第 122 页。该代码片段对我不起作用。我想知道为什么。 template<auto V1, decltype(V1)... VS> class HomoValueList { }; 作者声称这样的声明应该禁止非同构模板参数。但实际上我不能产生错误: int main() { HomoValueList<1, 'a', true> vals4; // Must be an error according to the author but not for me. return 0; } 这段代码是因为隐式转换而编译的,所以这本书是错误的。 我想知道自 C++17 标准发布以来是否发生了一些变化,因为作者声称必须禁止该行。 我不这么认为。即使在 C++17 模式下,最新的 Clang、GCC 和 MSVC 都接受此代码。 这是一个可行的 C++20 替代方案:(感谢 @PatrickRoberts) template <auto V1, auto ...VS> requires (std::is_same_v<decltype(V1), decltype(VS)> && ...) class HomoValueList {}; C++20 之前的版本,您可以使用 static_assert,但请注意,它不适合 SFINAE。 template<auto V1, auto ...VS> class HomoValueList { static_assert((std::is_same_v<decltype(V1), decltype(VS)> && ...)); };
当派生类仅重写所有方法的子集时,为什么会出现 C++ 编译错误,所有方法都具有相同的名称但不同的签名(重载)
简单地说,您有一个接口基类 A,它提供了一个多态 method(),一个派生类 B,它实现了其中一些 method() 的细节。然后一些外部函数调用这些,co...
我有以下类型函数来计算某个类型 T 是否是元组中类型列表的一部分: 模板 结构体IsInTuple; 模板 我有以下类型函数来计算某种类型T是否是元组中类型列表的一部分: template<typename T, typename Tuple> struct IsInTuple; template<typename T, typename ...Ts> struct IsInTuple<T, std::tuple<Ts...>> { static constexpr bool value = std::disjunction_v<std::is_same<T, Ts>...>; }; 我的问题是,是否可以将此函数推广到任何采用可变参数类型列表的可变参数模板类型,以便它不仅适用于元组,而且还适用于变体? 是否可以将此函数推广到任何采用可变参数类型列表的可变参数模板类型,以便它不仅适用于 std::tuples,而且还适用于 std::variants? 是的,可以。只需使用模板模板参数来概括情况即可。 template<typename T, typename Class> struct IsInTypeList; template<template<typename...Ts> class Class, typename T, typename ...Ts> struct IsInTypeList<T, Class<Ts...>> { static constexpr bool value = (std::is_same_v<T, Ts> || ...); }; // Example usage static_assert(IsInTypeList<int, std::tuple<int, float, double>>::value, "int is in the tuple"); static_assert(!IsInTypeList<char, std::tuple<int, float, double>>::value, "char is not in the tuple"); static_assert(!IsInTypeList<char, std::variant<int, float, double>>::value, "char is not in the tuple");
当存在移动和复制构造函数时,C++ 默认构造函数不会通过“using”继承
A级{ 民众: A(){}; }; B 类:公共 A{ 民众: 使用 A::A; B(const B&) = 默认值; B(B&&)=默认值; }; 乙b; 编译器 (g++ (5.4.0-6ubuntu1) /...
我有可以简化为的代码 std::variant v[2] = foo(); int a = std::get(v[0]); 浮点数 b = std::get(v[1]); 显然这可以...
我正在尝试创建一个可以包含类型包的类。 // 包.hpp 模板 班级包决赛 { Pack(const std::tuple items) : items_(std::move(item...
为什么 OpenGL 告诉我在运行后抛出“int”实例后调用终止?
所以我尝试使用 GLFW 制作一个 OpenGL 项目,并很高兴在 Visual Studio 代码中使用它,但是当我编译和运行该程序时,它会抛出错误。 我尝试在窗口中制作 3 个三角形,它...
用 noexcept(...) 替换 throw(...) - ABI 跨语言标准安全?
假设我使用的库在其标头中具有如下声明: #if __cplusplus >= 201703L // C++17 或更高版本 #define _NOTHROW noexcept(true) #define _THROWS(x) noexcept(假) #
我正在尝试创建一个可以包含类型包的类。 // 包.hpp 模板 类包最终{ Pack(const std::tuple items) : items_(std::move(items...
我有 2 个类 BaseArrayList,它是一个抽象模板类和一个来自 BaseArrayList 的 ArrayList 派生类,我让用户输入他们想要的列表类型,但问题是我...
为什么 std::vector 构造函数抛出 std::length_error 而不是 std::bad_alloc?
考虑以下示例: #包括 #包括 #包括 int main() { std::vector::size_type n; std::cout << "Enter arra...
我正在尝试将数学表达式字符串转换为 C++17 中的 lambda 函数。我怎样才能用函数进行这种类型的转换? std::function str2lambda(const std::string&am...
自 2017 年 3 月 13 日起,std::is_callable 已从 cppreference.com 中消失。 WaybackMachine 上的最新可用描述是 2016 年 11 月 21 日。 std::is_callable 和 std::
已解决:使用 OpenCV 和 libmagic 创建适用于 MacOS 的独立可执行文件
我目前正在尝试将我的程序编译为独立的。 我使用的是 MacOS M2,目标操作系统也是 MacOS M2。我只想将可执行文件从一台 Mac 拖放到另一台 Mac 上,然后
Leetcode AddressSanitizer 由于一个简单的条件而出错
我是Leetcode新手,我不知道我的代码有什么问题。我正在解决“二和”问题,当我尝试编写重复的条件时出现错误
在 constexpr 构造函数中使用 lambda 函数和 std::tie
我尝试在 C++17 中使用 constexpr 构造函数和 lambda,该 lambda 使用 std::tie 从元组初始化类中的字段。 代码类似于: #包括 枚举类...
我尝试在 C++17 中使用 constexpr 构造函数和 lambda,该 lambda 使用 std::tie 从元组初始化类中的字段。 代码类似于: #包括 枚举类...
我有一个参数打包函数,如下所示, 模板 void foo(const Args&... args) { 酒吧(SomeClass {args}...); } 没有??上面的部分,...
g++:致命错误:无法执行‘d21’:execvp:没有这样的文件或目录编译终止
当我尝试编译 QT 项目时,出现以下错误: g++:致命错误:无法执行“d21”:execvp:没有这样的文件或目录 我还尝试在编译时包含文件的完整路径,但是......
正确从 string_view 复制临时字符串 (C++ 17)
我有一个带有以下声明的函数: void Add(string_view 源, string_view 目标); 它应该做什么:它从 string_views 添加一对单词并保存它们以供以后使用:...