我想获得一个std::valarray范围,该范围引用另一个valarray对象的值范围,而不制作值的副本。文档有关的指标规定[]操作,我需要使用std::slice std::gslice或布尔std::valarray对象作为参数来实现这一点,在这种情况下,我会得到一个slice_array,gslice_array或mask_array为回报:
slice_array<T> operator[] (slice slc);
gslice_array<T> operator[] (const gslice& gslc);
mask_array<T> operator[] (const valarray<bool>& msk);
indirect_array<T> operator[] (const valarray<size_t>& ind);
Run Code Online (Sandbox Code Playgroud)
当我查看这些返回类型的描述时,它们都是一样的!查看以下描述:slice_array,gslice_array,mask_array,indirect_array。
那么我应该在哪种情况下使用呢?我理解这一点,mask_array并且indirect_array似乎更倾向于专门从某个范围中选择值,但是slice_array/ gslice_array呢?
就我而言,我正在考虑使用slice_array它,因为这听起来很像我在做什么(我正在切片,对吧?)。但我更喜欢一些具体的东西!
我遇到过这些relaxed/strict pointer safety概念,并且它是实现定义的,无论实现是宽松还是严格的指针安全。我的问题是关于现代实现:clang 和 g++ 是否具有严格或宽松的指针安全?
我想澄清以下关于严格指针安全概念的事情。有一个报价(第 3.7.4.3/4 节):
或者,一个实现可能具有严格的指针安全性,在这种情况下,指向具有动态存储持续时间的对象的指针值不是安全派生的指针值是无效的指针值,除非引用的完整对象先前已声明为可达(20.7 .4)。
这个限制对我来说完全不清楚。此外,我尝试使用cplusplus.com 示例对概念进行实验
// declare_reachable / undeclare_reachable example
#include <iostream>
#include <memory>
#include <cstdint>
int main() {
int * p = new int (1); // dynamic object
std::declare_reachable(p);
p = (int*)((std::uintptr_t)p ^ UINTPTR_MAX); // scrambling p
// dynamic object not reachable by any live safely-derived pointer
p = std::undeclare_reachable((int*)((std::uintptr_t)p ^ UINTPTR_MAX));
// p is back again a safely-derived pointer to the dynamic object
std::cout << "p: …Run Code Online (Sandbox Code Playgroud) 如cplusplus.com所述,std::forward有两个签名:
template <class T> T&& forward (typename remove_reference<T>::type& arg) noexcept;
template <class T> T&& forward (typename remove_reference<T>::type&& arg) noexcept;
Run Code Online (Sandbox Code Playgroud)
典型的用法std::forward是在将参数传递给其他函数时保留rvalueness.让我们用一个例子来说明这一点:
void overloaded(int &) { std::cout << "lvalue"; }
void overloaded(int &&) { std::cout << "rvalue"; }
template <typename T>
void fwd(T && t)
{
overloaded(std::forward<T>(t));
}
Run Code Online (Sandbox Code Playgroud)
当我们打电话时fwd(0),T推断为int(t有类型int &&).然后我们打电话std::forward<int>(t).该调用的结果是类型的表达式,int &&因此选择了第二个overloaded函数版本,程序将"rvalue"打印到标准输出.
当我们调用fwd(i)(其中我是一些int变量)时,T推导为int&(t有类型 …
就在我以为我理解了C++ 11中iostreams的多遍移动构造时(感谢/sf/answers/570944951/的介绍),我遇到了这个问题:
§27.7.2.5.1[iostream.cons]/3
basic_iostream(basic_iostream&& rhs);
3效果:通过构造basic_istream基类来从rvalue rhs移动构造move(rhs).
那么另一个基地会发生什么basic_ostream?
我看到libc ++提供了std::basic_ostream一个受保护的默认构造函数,在此处调用(并且,与basic_iostream的常规构造函数中的§27.7.2.5.1/ 1的字母相矛盾),并且什么都不做.这是怎么回事?
从cplusplus.com网站获得简单的代码
#include <stdio.h>
char mybuffer[80];
int main() {
FILE *pFile;
pFile = fopen("example.txt","r+");
if (pFile == NULL)
perror("Error opening file");
else {
fputs("test",pFile);
fflush(pFile); // flushing or repositioning required
fgets(mybuffer, 80, pFile);
puts(mybuffer);
fclose(pFile);
return 0;
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道像上面的代码那样作为其参数的fflush情况下真正会做什么file,因为无论有无fflush(pFile)行,结果都是一样的-空缓冲区(输出无内容)。
PS:我正在Linux gcc(6.3.0)上运行代码
我在从字符串创建向量时遇到问题.有人可以解释下面4例之间的区别吗?根据cplusplus.com我的预期Case 1工作方式与Case 2出于同样奇怪的原因一样,但事实并非如此.
typedef std::vector<uint8_t> uint8vec_t;
std::string keySecret ()
{
return std::string ("SomeSecret");
}
Run Code Online (Sandbox Code Playgroud)
情况1
// throws std::bad_alloc
uint8vec_t vSecret (keySecret ().begin (), keySecret ().end ());
Run Code Online (Sandbox Code Playgroud)
案例2
// results in a vector with strange length
uint8vec_t vSecret (keySecret ().begin (), keySecret ().begin () + keySecret ().length ());
Run Code Online (Sandbox Code Playgroud)
案例3
// throws std::bad_alloc
uint8vec_t vSecret (&keySecret ()[0], &keySecret ()[keySecret ().length ()]);
Run Code Online (Sandbox Code Playgroud)
案例4
// throws std::bad_alloc
uint8vec_t vSecret (&keySecret ()[0], &keySecret ()[0] + keySecret ().length ());
Run Code Online (Sandbox Code Playgroud) 我宣布了一对矢量:
vector <pair <int, int> > args;
Run Code Online (Sandbox Code Playgroud)
然后我想像这样将一对推入向量:
args.push_back((1,-1));
Run Code Online (Sandbox Code Playgroud)
它告诉我逗号的左手操作数没有效果.我哪里出错了?