template<typename T> void doSomething(T&& mStuff)
{
auto lambda([&mStuff]{ doStuff(std::forward<T>(mStuff)); });
lambda();
}
Run Code Online (Sandbox Code Playgroud)
mStuff使用&mStuff语法捕获完美转发的变量是否正确?
或者是否有针对完美转发变量的特定捕获语法?
编辑:如果完美转发的变量是参数包怎么办?
我很好奇为什么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)
有任何想法吗?
我有一个项目正确编译并在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)
问题:
__clang__在所讨论的代码附近没有任何宏,并且c ++ 11模式中的clang完全没有问题.我很少看到,decltype(auto)但是当我这样做时,它会让我感到困惑,因为它似乎与auto从函数返回时一样.
auto g() { return expr; }
decltype(auto) g() { return expr; }
Run Code Online (Sandbox Code Playgroud)
这两种语法有什么区别?
我试过四处寻找,但一直没能找到关于二进制文字和字节序的东西.二进制文字是little-endian,big-endian还是其他什么东西(比如匹配目标平台)?
举个例子,十进制值是0b0111多少?是7吗?平台具体?别的什么?编辑:我选择了一个错误的值7,因为它表示在一个字节内.尽管如此,这个问题仍得到了充分的回答.
一些背景:基本上我试图找出最低有效位的值是什么,并用二进制文字掩盖它似乎是一个很好的方法...但只有在有一些关于字节序的保证.
我需要在性能关键路径上生成随机布尔值.
我为此写的代码是
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()在开始时打电话.
当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
在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中有什么改变允许这个?
假设我有处理基类和派生类的工厂函数:
#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++ 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 cationnoexcept(true).
如上所示,零大小的std::arrays在C++ 11中是完全允许的,与零大小的数组(例如int A[0];)相比,它们被明确禁止,但是一些编译器(例如,GCC)允许它们以未定义的行为为代价. .
考虑到这种"矛盾",我有以下问题:
为什么C++委员会决定允许零大小的std::arrays?
有什么有价值的用途吗?