这段代码:
#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 的非标准功能,和/或我的代码有错吗?
我最近开始学习介子,我正在我的一个项目中测试切换到它(从CMake)。问题是我通常使用cpack来构建项目的包/安装程序,在搜索介子文档以查找类似于cpack 的内容后,我找不到任何东西。
要求/我目前使用cpack做什么
有关于构建发布档案,然后使用脚本使用打包工具(例如inno)处理它们的信息。然而,这并不是我真正想要的,因为它比cpack更笨拙和不灵活(即,如果目录结构发生变化,我必须更改 3 个不同的脚本)。
最终我可以学习使用介子系统并手动编写打包脚本,毫无疑问这会让我成为一个更好的脚本编写者,但是,我很想知道是否有更好的方法来做到这一点,这在文档中没有公布,或者有一些非官方项目可以使该过程自动化。
编辑
包我的意思是像一个 deb 包 - 一个系统包管理器的包,而不是像柯南这样的包
假设我有一个包含成员的类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移动只是风格问题?