标签: c++14

如何使用C++避免在其中使用"if"条件的"for"循环?

几乎所有我编写的代码,我经常处理集合中的集合减少问题,最终会在它们内部产生天真的"if"条件.这是一个简单的例子:

for(int i=0; i<myCollection.size(); i++)
{
     if (myCollection[i] == SOMETHING)
     {
           DoStuff();
     }
}
Run Code Online (Sandbox Code Playgroud)

使用函数式语言,我可以通过将集合减少到另一个集合(轻松)来解决问题,然后在简化集上执行所有操作.在伪代码中:

newCollection <- myCollection where <x=true
map DoStuff newCollection
Run Code Online (Sandbox Code Playgroud)

在其他C变体中,比如C#,我可以使用where子句来减少

foreach (var x in myCollection.Where(c=> c == SOMETHING)) 
{
   DoStuff();
}
Run Code Online (Sandbox Code Playgroud)

或者更好(至少在我看来)

myCollection.Where(c=>c == Something).ToList().ForEach(d=> DoStuff(d));
Run Code Online (Sandbox Code Playgroud)

诚然,我做了很多范例混合和主观/意见为主的风格,但我不禁觉得我失去了一些东西真的很基本的,可以让我利用这个最佳技术和C++.有人可以开导我吗?

c++ c++11 c++14

111
推荐指数
10
解决办法
1万
查看次数

通用lambda如何在C++ 14中工作?

auto在C++ 14标准中,通用lambda如何工作(关键字作为参数类型)?

它是基于C++模板的,每个不同的参数类型编译器生成一个具有相同主体但替换类型(编译时多态)的新函数,还是更类似于Java的泛型(类型擦除)?

代码示例:

auto glambda = [](auto a) { return a; };
Run Code Online (Sandbox Code Playgroud)

c++ lambda auto c++14

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

C++ 14是否在C++中添加了新的关键字?

C++标准委员会倾向于回避在该语言中添加新的关键字,但C++ 11并非如此.一些例子:

constexpr
decltype
thread_local
auto // New usage
noexcept
nullptr
static_assert
alignof
alignas
Run Code Online (Sandbox Code Playgroud)

C++ 14是否引入了新的关键字?

c++ keyword c++11 c++14

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

什么是透明比较器?

在C++ 14中,关联容器似乎已从C++ 11改变 - [associative.reqmts]/13说:

成员函数模板find,count,lower_bound,upper_bound,并且equal_range不得,除非类型参与重载决议Compare::is_transparent存在.

使比较器"透明"的目的是什么?

C++ 14还提供了这样的库模板:

template <class T = void> struct less {
    constexpr bool operator()(const T& x, const T& y) const;
    typedef T first_argument_type;
    typedef T second_argument_type;
    typedef bool result_type;
};

template <> struct less<void> {
    template <class T, class U> auto operator()(T&& t, U&& u) const
    -> decltype(std::forward<T>(t) < std::forward<U>(u));
    typedef *unspecified* is_transparent;
};
Run Code Online (Sandbox Code Playgroud)

因此,例如,std::set<T, std::less<T>>不会有一个透明的比较,而是std::set<T, std::less<>> …

c++ c++-faq c++14

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

在新运算符上使用std :: make_unique的优点

什么是使用的优势,std::make_uniquenew运营商的初始化std::unique_ptr

换句话说,为什么

std::unique_ptr<SomeObject> a = std::make_unique(SomeObject(...))
Run Code Online (Sandbox Code Playgroud)

比做好

std::unique_ptr<SomeObject> a = new SomeObject(...)
Run Code Online (Sandbox Code Playgroud)

我尝试在线查看很多,我知道new在现代C++中避免使用操作符是一个很好的经验法则,但我不确定在这个确切的场景中有什么优势.它是否可以防止可能发生的任何类型的内存泄漏?做一个std::make_unique比使用更快new吗?

c++ unique-ptr c++14

95
推荐指数
2
解决办法
6万
查看次数

当C++ 14已经具有泛型lambda时,在C++ 20中引入模板lambda的需求是什么?

引入了通用lambdas,可以编写以下内容:

auto func = [](auto a, auto b){
    return a + b;
};
auto Foo = func(2, 5);
auto Bar = func("hello", "world");
Run Code Online (Sandbox Code Playgroud)

很明显,这个通用lambda func就像模板化函数func一样有效.

为什么C++委员会决定为通用lamda添加模板语法?

c++ generic-lambda c++14 c++20

90
推荐指数
4
解决办法
6641
查看次数

为什么lambda的大小为1个字节?

我正在处理C++中一些lambda的记忆,但我对它们的大小感到有些困惑.

这是我的测试代码:

#include <iostream>
#include <string>

int main()
{
  auto f = [](){ return 17; };
  std::cout << f() << std::endl;
  std::cout << &f << std::endl;
  std::cout << sizeof(f) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里运行它:http://fiddle.jyt.io/github/b13f682d1237eb69ebdc60728bb52598

ouptut是:

17
0x7d90ba8f626f
1
Run Code Online (Sandbox Code Playgroud)

这表明我的lambda的大小是1.

  • 这怎么可能?

  • lambda至少应该是指向它的实现的指针吗?

c++ lambda sizeof c++11 c++14

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

什么是const无效?

std::is_void状态描述:

如果T为void类型,const void,volatile void或const volatile void ,则提供等于true的成员常量值.

那可能是什么const void,或者是volatile void什么?

这个答案表明const void返回类型无效(但是在VC++ 2015上编译)

const void foo() { }
Run Code Online (Sandbox Code Playgroud)

如果按标准,const void无效(VC错误) - 那么是什么const void

c++ c++11 c++14

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

默认值,值和零初始化混乱

我对value-&default-&zero-initialization非常困惑.特别是当他们参与不同的标准C++ 03C++ 11(和C++ 14)时.

我引用并试图在这里扩展一个非常好的答案Value-/Default-/Zero-初始化C++ 98C++ 03,以使其更加通用,因为它可以帮助很多用户,如果有人可以帮助填写需要差距,以便对何时发生的情况有一个很好的概述?

通过示例的全面见解简而言之:

有时新运算符返回的内存将被初始化,有时它不会取决于您正在新建的类型是POD(普通旧数据),还是它是一个包含POD成员且正在使用的类编译器生成的默认构造函数.

  • C++ 1998中,有两种类型的初始化:默认初始化
  • C++ 2003第三种类型的初始化中,添加了值初始化.
  • C++ 2011/C++ 2014中,仅添加了列表初始化,并且value-/default-/zero-initialization的规则稍有改变.

假设:

struct A { int m; };                     
struct B { ~B(); int m; };               
struct C { C() : m(){}; ~C(); int m; };  
struct D { D(){}; int m; };             
struct E { …
Run Code Online (Sandbox Code Playgroud)

c++ c++11 c++03 c++98 c++14

81
推荐指数
2
解决办法
1万
查看次数

自C++ 17以来,具有正确地址和类型的指针仍然始终是有效指针吗?

(参考这个问题和答案.)

在C++ 17标准之前,[basic.compound]/3中包含以下句子:

如果类型T的对象位于地址A,则类型为cv T*的指针(其值为地址A)被称为指向该对象,而不管该值是如何获得的.

但是自从C++ 17以来,这句话已被删除.

例如,我相信这句话使这个示例代码定义,并且从C++ 17开始这是未定义的行为:

 alignas(int) unsigned char buffer[2*sizeof(int)];
 auto p1=new(buffer) int{};
 auto p2=new(p1+1) int{};
 *(p1+1)=10;
Run Code Online (Sandbox Code Playgroud)

在C++ 17之前,p1+1保持地址*p2并具有正确的类型,因此*(p1+1)是指向*p2.在C++中,17 p1+1是一个指向前端指针,所以它不是指向对象指针,我相信它不是可以解除引用的.

对标准权的这种修改的解释是否还有其他规则来补偿所引用的句子的删除?

c++ pointers language-lawyer c++14 c++17

80
推荐指数
2
解决办法
4177
查看次数