小编Obj*_*ect的帖子

为什么std::visit in a unsatisfied concept会导致gcc编译错误

这段代码:

#include <concepts>
#include <string>
#include <variant>

struct any_callable {
public:
    template<typename T>
    void operator()(T&&) {}
};

template<typename V>
concept is_variant = requires(V v) { std::visit(any_callable{}, v); };

int main() {
    constexpr bool wrapped = is_variant<std::string>;
}
Run Code Online (Sandbox Code Playgroud)

不能在 gcc 11 下编译。它给出了一堆关于valueless_by_exception诸如此类的错误。但是,它确实在 msvc ( Godbolt )下编译。现在,据我所知,在这种情况下,如果它通常无法编译,它将衰减为 false,否则为 true。msvc 的行为似乎支持这一点。

所以:这是 gcc 中的错误,msvc 的非标准功能,和/或我的代码有错吗?

c++ gcc c++-concepts c++20

7
推荐指数
1
解决办法
133
查看次数

是否有与 CMake 的 CPack 类似/等效的介子工具?

我最近开始学习介子,我正在我的一个项目中测试切换到它(从CMake)。问题是我通常使用cpack来构建项目的包/安装程序,在搜索介子文档以查找类似于cpack 的内容后,我找不到任何东西。

要求/我目前使用cpack做什么

  • 单个脚本自动构建和打包二进制版本(如 deb、rpm、windows installer 等)
  • 与构建系统集成 - 自动选择目标,不需要重新定义安装逻辑或结构
  • 支持至少构建 deb 包和 windows 安装程序(不关心哪个)

有关于构建发布档案,然后使用脚本使用打包工具(例如inno)处理它们的信息。然而,这并不是我真正想要的,因为它比cpack更笨拙和不灵活(即,如果目录结构发生变化,我必须更改 3 个不同的脚本)。

最终我可以学习使用介子系统并手动编写打包脚本,毫无疑问这会让我成为一个更好的脚本编写者,但是,我很想知道是否有更好的方法来做到这一点,这在文档中没有公布,或者有一些非官方项目可以使该过程自动化。

编辑

包我的意思是像一个 deb 包 - 一个系统包管理器的包,而不是像柯南这样的包

c++ cpack meson-build

5
推荐指数
1
解决办法
340
查看次数

构造函数采用 std::string_view 与 std::string 并移动

假设我有一个包含成员的类std::string,并且我想在其构造函数之一中获取该成员的值。

一种方法是采用类型参数std::string,然后使用std::move

Foo(std::string str) : _str(std::move(str)) {}
Run Code Online (Sandbox Code Playgroud)

据我了解,移动字符串只是复制其内部指针,这意味着它基本上是免费的,因此传递 aconst char*与传递 a 一样有效const std::string&

然而,在 C++17 中,我们得到了std::string_view,并承诺提供廉价副本。所以上面的内容可以写成:

Foo(std::string_view str) : _str(str.begin(), str.end()) {}
Run Code Online (Sandbox Code Playgroud)

不需要移动或构建临时的std::string,但我认为它实际上只是有效地做了与以前相同的事情。

那么我在这里缺少什么吗?std::string_view还是使用或std::string移动只是风格问题?

c++ c++17

5
推荐指数
1
解决办法
3854
查看次数

标签 统计

c++ ×3

c++-concepts ×1

c++17 ×1

c++20 ×1

cpack ×1

gcc ×1

meson-build ×1