c++17相关内容
GCC和clang对于是否应该编译以下代码意见不一: template struct tuple {}; template struct Test; template typename... Outer, // XXX Types
..
我想知道有没有这样的方法: using CallbackType = std::function; (我知道上面的代码无法编译,并抱怨nodiscard无法应用于类型!) 我的目标是强制回调的调用方检查它的返回值! 推荐答案 您可以直接包装std::function或真正的lambda来修改属性,如[[nodiscar
..
我正在尝试使用紧凑文件夹表达式,但未成功。 例如,下面是一个正在运行的C++17代码 template struct Fold_And : std::integral_constant { }; template constexpr auto Fold_And_v = Fold_And::
..
C++20标准规定函数调用,7.6.1.3/8: 参数的初始化(包括每个关联值计算和副作用)相对于任何其他参数的初始化是不确定的。 不确定排序(相对于非排序)可确保影响相同内存区域的副作用不是未定义的行为。Cp首选项gives the following examples: f(i = -2, i = -2); // undefined behavior until C++17
..
从标准的6.7.7(临时对象)中可以看到: 当将类类型X的对象传递到函数或从函数返回时,如果X至少有一个合格的复制或移动构造函数([特殊]),每个这样的构造函数都是平凡的,并且X的析构函数要么是平凡的,要么是删除的,则允许实现创建一个临时对象来保存函数参数或结果对象。临时对象分别从函数实参或返回值构造,函数的参数或返回对象被初始化,就像使用符合条件的普通构造函数复制临时对象一样(即使该构造函
..
我有以下示例代码: #include struct Base { bool operator==(const Base& rhs) const { return this->equalTo(rhs); } virtual bool equalTo(const Base& rhs) const = 0; }; inline
..
当派生类使用基类构造函数时,演绎似乎总是fail。然而,当基类有许多构造函数时,重新定义所有构造函数是非常笨拙的。当基类使用新的构造函数快速演变时,这也是一件痛苦的事情。这个老问题是在两年多前提出的,所以我想知道:到2020年,当c++17和c++2a可用时,有什么办法可以解决这个问题吗? template class base_t { public:
..
目前我有一个项目需要C++17,因此在CMakeLists.txt中我很早就有这样一行: set(CMAKE_CXX_STANDARD 17) 从命令行(cmake),偶尔我想测试一下该项目是否也可以用C++20编译。(以避免意外)。 如何选择从命令行使用C++20编译? 如果我这样做cmake -DCMAKE_CXX_STANDARD=20,则它稍后会被配置覆盖,而不是17
..
我在Github(https://github.com/Quuxplusone/coro/blob/master/examples/pythagorean_triples_generator.cpp)上查看了一个随机的C++示例,惊讶地发现它实际上可以编译(https://coro.godbolt.org/z/JXTX4Y)。 #include
..
从C++17开始,可以使用inline关键字初始化头中的全局变量和静态成员。虽然我理解为什么函数中的静态变量需要保护(因为初始化即使在多线程上下文中也应该只发生一次),但我不明白为什么这些新的内联变量也要保护(您可以在这里看到:https://godbolt.org/z/YF8PeQ)。我认为在任何情况下,所有全局变量和静态成员的初始化都是在程序执行开始时(甚至在main()之前)进行的,所以现在
..
考虑全局变量(不是静态类成员!)在头文件中声明: inline static int i{}; 对于我测试的几个编译器来说,它是有效的构造,并且实验表明,将在不同的翻译单元中创建几个不同的对象,尽管它也被声明为内联(这意味着该变量的一个实例必须存在于程序中)。那么,在这种情况下,static关键字是否比inline更优先? 推荐答案 那么,在这种情况下,静态关键字是否比INL
..
背景 在this answer下针对非常简单的问题开始了有关此问题的讨论。 问题 此简单代码意外地解析了std::basic_string的构造函数: #include int main() { std::string s{"some string to test", 2, 3}; return 0; } 现在有人认为这将调用此构造函
..
我正在学习联机教程:vulkan-tutorial其中作者正在添加描述符池和描述符集的功能。 我使用的是Vulkanv1.2.135.0,我的着色器设置为#version 450 我几乎完成了本教程的这一部分,我能够渲染旋转正方形,并且在调试模式下编译和运行时没有收到来自Vulkan层的错误。 我在上面的链接提供的页面底部附近,他在UniformBufferOjbect结构中引入
..
假设我们有一个名为AAA的类,它同时支持复制/移动: class AAA { public: AAA() = default; ~AAA() = default; AAA(const AAA& rhs) { std::cout
..
直接- ;与 ;复制初始化 通过这个问题(Is it direct-initialization or copy-initialization?)我了解了直接初始化和复制初始化的区别: direct-initialization copy-initialization -----------------------
..
有没有一种标准的方法来获取函数参数的类型并将这些类型作为模板参数包进行传递?我知道这在C++中是可能的,因为it has been done before。 我希望在C++14或即将推出的C++1Z中,会有一种惯用的方式在这里实现arg_types...: template void some_function(); // Params
..
给定矩阵模板类mat,下面的成员函数允许我高效地转置行向量或列向量,因为它们具有相同/相应的内存占用: template struct mat { // ... template
..
blot:C++有隐式转换,我正在寻找阻止它的方法。 让我为下面的代码片段举一个相同的例子: #include int incrementByOne(int i) { return ++i; } int main() { bool b = true; std::cout
..
数组具有作为连续内存块的良好属性。当使用new为数组分配内存时,它返回指向连续挡路内存的指针。但是,如果我使用new分配一个矩阵,如下所示: #include //std::cin int main() { int n, m; std::cin >> n >> m; int** mat = new int*[n]; for (int i
..
我在windows10和mingw上运行g++编译器。 在cmd中检查编译器版本时,我得到以下信息: g++ --version- g++ (MinGW.org GCC Build-2) 9.2.0 与c++ --version相同 当我使用结构化绑定编译CPP程序时,收到警告: warning: structured bindings only available wit
..