标签: c++17

Lambda回归:这是合法的吗?

考虑这个相当无用的程序:

#include <iostream>
int main(int argc, char* argv[]) {

  int a = 5;

  auto it = [&](auto self) {
      return [&](auto b) {
        std::cout << (a + b) << std::endl;
        return self(self);
      };
  };
  it(it)(4)(6)(42)(77)(999);
}
Run Code Online (Sandbox Code Playgroud)

基本上我们正在尝试制作一个返回自己的lambda.

  • MSVC编译程序,然后运行
  • gcc编译程序,并且它是段错误的
  • clang用一条消息拒绝该程序:

    error: function 'operator()<(lambda at lam.cpp:6:13)>' with deduced return type cannot be used before it is defined

哪个编译器是对的?是否存在静态约束违规,UB或两者都没有?

clang接受更新此轻微修改:

  auto it = [&](auto& self, auto b) {
          std::cout << (a + b) << std::endl;
          return [&](auto p) { return …
Run Code Online (Sandbox Code Playgroud)

c++ lambda language-lawyer auto c++17

122
推荐指数
6
解决办法
9029
查看次数

C++20 行为用相等运算符破坏现有代码?

我在调试这个问题时遇到了这个问题

我一直将其精简为仅使用Boost Operators

  1. 编译器资源管理器C++17 C++20

    #include <boost/operators.hpp>
    
    struct F : boost::totally_ordered1<F, boost::totally_ordered2<F, int>> {
        /*implicit*/ F(int t_) : t(t_) {}
        bool operator==(F const& o) const { return t == o.t; }
        bool operator< (F const& o) const { return t <  o.t; }
      private: int t;
    };
    
    int main() {
        #pragma GCC diagnostic ignored "-Wunused"
        F { 42 } == F{ 42 }; // OKAY
        42 == F{42};         // C++17 OK, C++20 infinite …
    Run Code Online (Sandbox Code Playgroud)

c++ spaceship-operator c++17 c++20

107
推荐指数
1
解决办法
4526
查看次数

内联变量如何工作?

在2016年奥卢ISO C++标准会议上,一项名为Inline Variables的提案被标准委员会投票选为C++ 17.

通俗地说,什么是内联变量,它们如何工作以及它们对什么有用?如何声明,定义和使用内联变量?

c++ c++17

106
推荐指数
3
解决办法
3万
查看次数

std :: lock_guard或std :: scoped_lock?

C++ 17引入了一个名为的新锁类std::scoped_lock.

从文档来看,它看起来与现有的std::lock_guard类相似.

有什么区别,什么时候应该使用它?

c++ multithreading locking c++17

106
推荐指数
4
解决办法
2万
查看次数

如何使用C ++ 17获得以字节为单位的文件大小

我应该知道,特定操作系统是否存在陷阱?

有很多重复(12345这个问题),但他们在几十年前进行了解答。在许多这些问题中,投票率很高的答案今天是错误的。

.sx上其他(旧质量检查)的方法

  • stat.h(wrapper sprintstatf),使用syscall

  • tellg(),根据定义返回一个位置,不一定返回bytes。返回类型不是int

c++ filesize c++-standard-library c++17

93
推荐指数
2
解决办法
6026
查看次数

何时类型信息在C++中向后流动?

我只是看着Stephan T. Lavavej谈论CppCon 2018"课程模板论证演绎",他在某些时候偶然说:

在C++类型中,信息几乎从不向后流动...... 我不得不说"差不多",因为有一两个案例,可能更多但很少.

尽管试图找出他可能指的是哪些案件,但我无法想出任何建议.因此问题是:

在哪些情况下,C++ 17标准要求类型信息向后传播?

c++ types language-lawyer type-deduction c++17

90
推荐指数
3
解决办法
5065
查看次数

如何在Visual Studio中启用C++ 17编译?

我想使用C++ 17的功能.

如何在Microsoft Visual Studio中将编译从C++ 14切换到C++ 17?

或者它在VS的发布版本中不可用?

c++ compilation visual-studio c++17

89
推荐指数
5
解决办法
8万
查看次数

polymorphic_allocator:何时以及为什么要使用它?

是关于cppreference的文档,是工作草案.

我必须承认,我不明白什么是真正的目的,polymorphic_allocator何时/为什么/如何使用它.
例如,pmr::vector具有以下签名:

namespace pmr {
    template <class T>
    using vector = std::vector<T, polymorphic_allocator<T>>;
}
Run Code Online (Sandbox Code Playgroud)

什么是polymorphic_allocator要约?std::pmr::vector对老式的提供有什么好处std::vector?我现在能做什么才能做到现在为止?
分配器的真正目的是什么?我应该何时使用它?

c++ allocator c++17

87
推荐指数
3
解决办法
1万
查看次数

为什么在C++ 17中使用std :: make_unique?

据我所知,引入了C++ 14 std::make_unique,因为由于没有指定参数评估顺序,这是不安全的:

f(std::unique_ptr<MyClass>(new MyClass(param)), g()); // Syntax A
Run Code Online (Sandbox Code Playgroud)

(说明:如果评估首先为原始指针分配内存,则g()std::unique_ptr构造之前抛出调用和异常,然后内存泄漏.)

呼叫std::make_unique是一种约束呼叫顺序的方法,从而使事情变得安全:

f(std::make_unique<MyClass>(param), g());             // Syntax B
Run Code Online (Sandbox Code Playgroud)

从那以后,C++ 17澄清了评估顺序,使得Syntax A也安全,所以这里是我的问题:在C++ 17中仍然有理由使用std::make_uniqueover std::unique_ptr的构造函数吗?你能举一些例子吗?

截至目前,我能想象的唯一原因是它只允许输入MyClass一次(假设您不需要依赖多态std::unique_ptr<Base>(new Derived(param))).但是,这似乎是一个非常弱的原因,特别是当构造函数std::make_unique不允许指定删除器时std::unique_ptr.

而且为了清楚起见,我并不是主张std::make_unique从标准库中删除(至少为了向后兼容而保持它有意义),而是想知道是否仍然存在强烈倾向于它的情况std::unique_ptr

c++ unique-ptr c++17

86
推荐指数
4
解决办法
6688
查看次数

现代C++的实验性功能是否可靠用于长期项目?

我有一个目前使用C++ 11/14的项目,但它需要类似的东西std::filesystem,它只在C++ 17中可用,因此我没有机会当前使用它.但是,我看到它在我当前的编译器中可用std::experimental::filesystem.使用实验性功能是一个好主意,假设我将来可以添加如下内容:

#ifdef CXX17 //if this is C++17
std::filesystem::something ...;
#else
std::experimental::filesystem::something ...;
#endif
Run Code Online (Sandbox Code Playgroud)

我担心的是:

1.是否保证所有兼容编译器具有相同的实验功能?

2.实验性特征是否容易发生重大变化,使其不可靠?

也许还有更多值得关注的事情.我为什么要或不应该使用它们?我对一个新项目感到困惑,不知道该决定什么.

c++ portability c++-standard-library c++11 c++17

84
推荐指数
4
解决办法
9305
查看次数