标签: c++14

在lambda中捕获完美转发的变量

template<typename T> void doSomething(T&& mStuff)
{
    auto lambda([&mStuff]{ doStuff(std::forward<T>(mStuff)); });
    lambda();
}
Run Code Online (Sandbox Code Playgroud)

mStuff使用&mStuff语法捕获完美转发的变量是否正确?

或者是否有针对完美转发变量的特定捕获语法?

编辑:如果完美转发的变量是参数包怎么办?

c++ lambda perfect-forwarding c++11 c++14

43
推荐指数
5
解决办法
9719
查看次数

为什么可以在构造函数中修改const成员?

我很好奇为什么const构件可以在构造函数中修改.

初始化中是否有任何标准规则可以覆盖成员的"常量"?

struct Bar {
    const int b = 5; // default member initialization
    Bar(int c):b(c) {}
};

Bar *b = new Bar(2); // Problem: Bar::b is modified to 2
                     // was expecting it to be an error
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c++ initialization const c++11 c++14

43
推荐指数
2
解决办法
3585
查看次数

C++中的Clang> = 3.3 1y模式无法解析<cstdio>标头

我有一个项目正确编译并在g ++ 4.8.1下运行,并在c ++ 11模式下运行> = 3.3.但是,当我切换到实验-std=c++1y模式时,<cstdio>通过Boost.Test间接包含的标题中的clang 3.3(但不是g ++)扼流圈(所以我自己不能轻易改变它)

// /usr/include/c++/4.8/cstdio
#include <stdio.h>

// Get rid of those macros defined in <stdio.h> in lieu of real functions.
// ...
#undef gets
// ...    

namespace std
{
// ...
using ::gets; // <-- error with clang++ -std=c++1y
// ...
}
Run Code Online (Sandbox Code Playgroud)

带有以下错误消息:

/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/cstdio:119:11:错误:全球没有名为'gets'的成员命名空间

在有关如何设置现代C++环境的本教程中,max_align_t遇到了类似的查找问题.建议使用sed脚本用#ifdef __clang__宏包围未知符号,但这似乎是一种脆弱的方法.

安装程序:普通的64位Linux Mint 15

g ++(Ubuntu 4.8.1-2ubuntu1~13.04)4.8.1

Ubuntu clang版本3.3-3~raring1(branches/release_33)(基于LLVM 3.3)

问题:

  • 是什么导致这个erorr?__clang__在所讨论的代码附近没有任何宏,并且c ++ 11模式中的clang完全没有问题.
  • 这是一个语言问题(C++ …

c++ header clang c++11 c++14

42
推荐指数
1
解决办法
6741
查看次数

从函数返回时auto和decltype(auto)有什么区别?

我很少看到,decltype(auto)但是当我这样做时,它会让我感到困惑,因为它似乎与auto从函数返回时一样.

auto g() { return expr; }
decltype(auto) g() { return expr; }
Run Code Online (Sandbox Code Playgroud)

这两种语法有什么区别?

c++ c++14

42
推荐指数
2
解决办法
4893
查看次数

C++ 14中二进制文字的字节顺序是什么?

我试过四处寻找,但一直没能找到关于二进制文字和字节序的东西.二进制文字是little-endian,big-endian还是其他什么东西(比如匹配目标平台)?

举个例子,十进制值是0b0111多少?是7吗?平台具体?别的什么?编辑:我选择了一个错误的值7,因为它表示在一个字节内.尽管如此,这个问题仍得到了充分的回答.

一些背景:基本上我试图找出最低有效位的值是什么,并用二进制文字掩盖它似乎是一个很好的方法...但只有在有一些关于字节序的保证.

c++ endianness c++14

42
推荐指数
5
解决办法
5134
查看次数

性能方面是什么是生成随机bool的最佳方法?

我需要在性能关键路径上生成随机布尔值.

我为此写的代码是

std::random_device   rd;
std::uniform_int_distribution<> randomizer(0, 1);
const int val randomizer(std::mt19937(rd()));
const bool isDirectionChanged = static_cast<bool>(val);
Run Code Online (Sandbox Code Playgroud)

但是不要认为这是我不喜欢做的最好的方法static_cast<bool>.

在网络上,我找到了一些解决方案

1. std::bernoulli_distribution

2. bool randbool = rand() & 1;记得srand()在开始时打电话.

c++ random boolean c++11 c++14

42
推荐指数
3
解决办法
6878
查看次数

用户定义的文字中是否允许使用C++ 14位分隔符?

当clang编译以下行时,g ++ 6.1会抱怨数字分隔符(请参阅Coliru上的实例):

auto time = 01'23s;
Run Code Online (Sandbox Code Playgroud)

根据C++ 14标准(N3796),哪个编译器(如果有)是正确的?

否则,允许数字分隔符(§2.14.2)只是<chrono>库的用户定义文字(§2.14.8)中的实现细节(§20.12.5.8)?恕我直言,它应该不是,因为这些文字是在unsigned long long参数上定义的.

我记得Howard Hinnant10'000s在他的CppCon 2016演讲"A <chrono>tutorial"(在他的演讲中大约42分钟)中作为一个例子.


(请注意,我不打算编码"1分23秒",这只是偶然的,因为八进制文字0123是64 + 16 + 3 == 83.为此我应该写

auto time = 1min + 23s;
Run Code Online (Sandbox Code Playgroud)

但是这种可能误导性的解释不是问题的一部分.)

c++ language-lawyer user-defined-literals c++14 digit-separator

42
推荐指数
3
解决办法
2410
查看次数

在C++ 14中,在新表达式的维度中使用double是否有效?

在C++ 14中给出以下代码:

void foo() {
  double d = 5.0;
  auto p1 = new int[d];
}
Run Code Online (Sandbox Code Playgroud)

clang在没有诊断的情况下编译它,而另一方面gcc产生以下诊断(见它在godbolt中生活):

error: expression in new-declarator must have integral or enumeration type
    7 |     auto p1 = new int[d];
      |                       ^
Run Code Online (Sandbox Code Playgroud)

我特意标记了这个C++ 14,因为在C++ 11模式下,clang将其视为格式不正确并产生以下诊断(请参阅godbolt中的内容):

error: array size expression must have integral or unscoped enumeration type, not 'double'
    auto p1 = new int[d];
              ^       ~
Run Code Online (Sandbox Code Playgroud)

clang是否正确?如果是这样,在C++ 14中有什么改变允许这个?

c++ language-lawyer c++14 new-expression

42
推荐指数
1
解决办法
2191
查看次数

将std :: unique_ptr <Derived>转换为std :: unique_ptr <Base>

假设我有处理基类和派生类的工厂函数:

#include <memory>

using namespace std;

struct B { virtual ~B() {} };
struct D : B {};

unique_ptr<B> MakeB()
{
    auto b = unique_ptr<B>( new B() );
    return b; // Ok!
}

unique_ptr<B> MakeD()
{
    auto d = unique_ptr<D>( new D() );
    return d; // Doh!
}
Run Code Online (Sandbox Code Playgroud)

在上面的最后一行,我需要move(d)为了使它工作,否则我得到"错误:无效转换std::unique_ptr<D>std::unique_ptr<D>&&." 我的直觉说,在这种情况下,编译器应该知道它可以隐式地创建d一个rvalue并将其移动到基指针中,但事实并非如此.

这在我的编译器(gcc 4.8.1和VS2012)中是不可靠的吗?预期的设计unique_ptr?标准有缺陷吗?

c++ unique-ptr c++11 c++14

41
推荐指数
1
解决办法
9057
查看次数

在C++ 11中是否存在零大小的std :: array的原因?

考虑以下代码片段,这是C++ 11编译器完全可以接受的:

#include <array>
#include <iostream>

auto main() -> int {
  std::array<double, 0> A;

  for(auto i : A) std::cout << i << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据标准§23.3.2.8[ 零大小的阵列 ]:

1数组应为特殊情况提供支持N == 0.

2在这种情况下N == 0,begin() == end() ==独特的价值.返回值
data()未指定.

3调用front()back()零大小数组的效果是未定义的.

4成员函数swap()应具有等效的noexcept-speci fi cation noexcept(true).

如上所示,零大小的std::arrays在C++ 11中是完全允许的,与零大小的数组(例如int A[0];)相比,它们被明确禁止,但是一些编译器(例如,GCC)允许它们以未定义的行为为代价. .

考虑到这种"矛盾",我有以下问题:

  • 为什么C++委员会决定允许零大小的std::arrays?

  • 有什么有价值的用途吗?

c++ arrays c++11 stdarray c++14

41
推荐指数
1
解决办法
4267
查看次数