在典型的C++代码中,C++ 17评估顺序保证(P0145)投票的含义是什么?
对于像这样的事情,它有什么变化
i=1;
f(i++, i)
Run Code Online (Sandbox Code Playgroud)
和
std::cout << f() << f() << f() ;
Run Code Online (Sandbox Code Playgroud)
要么
f(g(),h(),j());
Run Code Online (Sandbox Code Playgroud) 在C++中,你可以像这样声明lambdas:
int x = 5;
auto a = [=]() mutable { ++x; std::cout << x << '\n'; };
auto b = [&]() { ++x; std::cout << x << '\n'; };
Run Code Online (Sandbox Code Playgroud)
两个都让我修改x
,那有什么区别?
我不知道如何用C++ 0x编译器构建Boost.必须给bjam哪个选项?是否应修改user.config文件?有人可以帮助我吗?
最好的,维森特
具有模式匹配的函数式语言(有时?)有可能忽略一些绑定值,但是使用C++ 17结构化绑定似乎没有办法(std :: ignore with structured bindings?).建议是使用虚拟名称,但随后我们会收到有关未使用变量的警告.
有了clang和gcc的最新元首,这就做了预期的事情,这很好用,
[[maybe_unused]] auto x =4 ; // fine, no warning
[[maybe_unused]] auto [a,dummyb,dummyc] = std::tuple<int,int,float>(1,1,1.0f);
Run Code Online (Sandbox Code Playgroud)
但我也希望这会奏效:
auto [g,[[maybe_unused]]dummyh,[[maybe_unused]]dymmyi] =
std::tuple<int,int,float>(1,1,1.0f);
Run Code Online (Sandbox Code Playgroud)
是否有一个特定的原因属性不能在这里使用?(在标准和技术上).gcc或clang都不接受这个.
编辑,收集支持状态:(感谢godbolt /编译器浏览器).它按预期工作(也可能更早):
MSVC 17.3.5(和Visual Studio GUI)允许该属性,但它不适用于结构化绑定.错误报告
P0292R1 constexpr如果已包含在内,正在进行 C++ 17.它似乎很有用(并且可以取代SFINAE的使用),但关于static_assert
形成不良的评论,假分支中不需要诊断会让我害怕:
Disarming static_assert declarations in the non-taken branch of a
constexpr if is not proposed.
void f() {
if constexpr (false)
static_assert(false); // ill-formed
}
template<class T>
void g() {
if constexpr (false)
static_assert(false); // ill-formed; no
// diagnostic required for template definition
}
Run Code Online (Sandbox Code Playgroud)
我认为它是完全禁止static_assert
在constexpr内部使用if(至少是假/非分支,但实际上这意味着它不是一个安全或有用的事情).
这是如何从标准文本中产生的?我发现static_assert
在提案中没有提到措辞,并且C++ 14 constexpr函数允许static_assert
(cppreference的详细信息:constexpr).
是否隐藏在这个新句子中(6.4.1之后)?:
当constexpr if语句出现在模板化实体中时,在封闭模板或通用lambda的实例化期间,不会实例化丢弃的语句.
从那以后,我认为它也是禁止的,不需要诊断,调用调用图中某个地方可能调用的其他constexpr(模板)函数static_assert
.
底线:
如果我的理解是正确的,那么对于constexpr …
使用C++ 17,我们将有可能返回不可移动(包括不可复制)类型,例如std::mutex
,通过可以被认为是有保证的返回值优化(RVO):通过简化的值类别保证复制省略:
struct nocopy { nocopy(nocopy&) = delete; nocopy() = default; };
auto getRVO(){
return nocopy();
}
Run Code Online (Sandbox Code Playgroud)
我们还将具有结构化绑定,允许:
tuple<T1,T2,T3> f();
auto [x,y,z] = f();
Run Code Online (Sandbox Code Playgroud)
template<typename T1,typename T2,typename T3>
struct many {
T1 a;
T2 b;
T3 c;
};
// (Original questions missed 'many' on the next line. Thanks, T.C.)
auto f(){ return many{string(),5.7, false} };
auto [x,y,z] = f();
Run Code Online (Sandbox Code Playgroud)
但这些功能是否可以实现这样的功能呢?
auto get_ensured_rvo_str(){
return std::pair(std::string(),nocopy());
}
auto get_class_and_mutex(){
return many{SomeClass(),std::mutex(),std::string()}; …
Run Code Online (Sandbox Code Playgroud) 我正在尝试从visual studio或命令行中对文件应用clang现代化,利用我的visual studio 2015 C++项目中的包含路径和设置.
我创建了一个铿锵有力的设置文件,如下所示:
clang-tidy -dump-config=.clang-tidy
-checks="modernize-loop-convert,modernize-deprecated-headers"
Run Code Online (Sandbox Code Playgroud)
并验证它可以在单个文件上运行,来自(cygwin)命令行:clang-tidy.exe -explain-config
列表(以及其他内容)
'modernize-deprecated-headers' is enabled in the C:\abc\.clang-tidy.
Run Code Online (Sandbox Code Playgroud)
我可以通过手动设置包括在单个文件上运行它:
clang-tidy.exe someFile.cpp -- -Ic:/abc -I. -IIncludes
我安装了视觉工作室铛格式VS插件,和创建的示例.clang格式文件,{ BasedOnStyle: "LLVM", IndentWidth: 20 }
其是由VS插件拾取.然后我天真地尝试用clang-tidy配置来提供clang-format,但不出所料,这根本不起作用.
总结一下:如何在文件和visual studio项目上运行clang-tidy?
也许解决方法是从visual studio中转储每个文件的包含?任何前进的方式都可以.
以供参考:
我习惯打字random.randrange
.我会做一个from random import Random
从现在开始发现错误.
对于涉及程序生成的游戏(nope,而不是Minecraft克隆:p)我想保留几个不同的伪随机数生成器:
理由是我希望能够重现第一个,所以我不希望第二个干扰.
我以为random.Random
是为此而做的.不过有些令我困惑的是:
import random
rnd = random.Random()
rnd.seed(0)
print [random.randrange(5) for i in range(10)]
rnd.seed(0)
print [random.randrange(5) for i in range(10)]
Run Code Online (Sandbox Code Playgroud)
产生两个不同的序列.当我这样做时,rnd = random
事情按预期工作,但我确实需要几个发电机.
我错过了什么?
可能重复:
我可以列出 - 初始化只移动类型的向量吗?
编辑1:请考虑重新公开投票:我的问题强调就地建设.移动施工是另一种选择,但不是这个问题的内容.谢谢你的回答!
编辑2:因为我无法回答这个问题(它已经关闭)我在这里发表我自己的建议.以下不如我接受的答案好,但可能对其他人有用.至少只调用移动构造函数:
std::vector<A2> vec;
{
std::array<A2,3> numbers{{{2,3},{5,6},{7,8}}};
vec.reserve(numbers.size());
for (auto &v: numbers) vec.emplace_back(std::move(v)) ;
}
Run Code Online (Sandbox Code Playgroud)
原帖:
在考虑这个问题的答案时:在STL矢量数组中初始化类我发现我找不到从初始化列表中获取矢量的就地构造的方法.我错过了什么?
现在想要更清楚,我希望这(完全正确)初始化
std::vector<A2> k{{2,3},{4,5},{8,9}};
Run Code Online (Sandbox Code Playgroud)
有一个更类似的效果:
std::vector<A2> k2;
k2.reserve(3);
k2.emplace_back(2,3);
k2.emplace_back(4,5);
k2.emplace_back(8,9);
Run Code Online (Sandbox Code Playgroud)
但是,在第一种情况下,在插入时临时为复制构造函数调用A2.有没有办法避免这种情况?标准说什么?
我拼命地试了一下
std::vector<A2> k{{2,3},{4,5},std::move(A2{8,9})};
Run Code Online (Sandbox Code Playgroud)
但是这会产生对移动构造函数的额外调用,这也是我没想到的.我只是想明确暗示A2是暂时的,我原以为是隐含的.
完整示例:
#include <vector>
#include <iostream>
struct A2 {
int mk;
int mj;
A2(int k,int j) : mk(k),mj(j) {
std::cout << " constr for "<<this<< ":"<< mk<<std::endl;
}
A2(const A2& a2) {
mk=a2.mk;
mj=a2.mj;
std::cout << "copy constr for …
Run Code Online (Sandbox Code Playgroud) " as-if规则 "使编译器有权优化或重新排序表达式,这些表达式在某些规则下不会对程序的输出和正确性产生影响,例如;
§1.9.5
执行格式良好的程序的一致实现应该产生与具有相同程序和相同输入的抽象机的相应实例的可能执行之一相同的可观察行为.
我上面链接的cppreference url特别提到了易失性对象的值的特殊规则,以及C++ 14下的"新表达式":
New-expression还有as-if规则的另一个例外:即使提供了用户定义的替换并且具有可观察的副作用,编译器也可以删除对可替换分配函数的调用.
我认为这里的"可替换"是所谓的例如
§18.6.1.1.2
可替换:C++程序可以使用此函数签名定义一个函数,该函数取代了C++标准库定义的默认版本.
以下是否mem
可以根据as-if规则删除或重新排序?
{
... some conformant code // upper block of code
auto mem = std::make_unique<std::array<double, 5000000>>();
... more conformant code, not using mem // lower block of code
}
Run Code Online (Sandbox Code Playgroud)
有没有办法确保它不被删除,并保持在代码的上下块之间?mem
我想到了一个放置良好的volatile(或/或volatile std :: array或auto的左侧),但由于没有读取,我认为即使这样也无法在as-if规则下提供帮助.
边注; 我无法让visual studio 2015进行优化mem
和分配.
澄清:观察这种情况的方法是对OS的分配调用来自两个块的任何i/o.这一点是针对测试用例和/或尝试在新位置分配对象.