取自:cppreference
直到C++ 11:
如果提取失败(例如,如果输入了预期数字的字母),则值保持不变,并设置failbit.
从C++ 11开始:
如果提取失败,则将零写入值并设置failbit.如果提取导致值太大或太小而无法拟合值,
std::numeric_limits<T>::max()或者std::numeric_limits<T>::min()被写入并且设置了failbit标志.
由于此更改,这意味着以下代码段:
int x = 1;
std::cin >> x;
return x;
Run Code Online (Sandbox Code Playgroud)
如果数值转换失败,将1在C++ 11之前返回,0否则返回.
为什么标准委员会会引入如此微妙的突破性变化?或者更确切地说,在C++ 11之前可以使用哪种代码来保证这种变化?
std::vector<int>我的C++应用程序中有一个变量.矢量的大小在运行时确定,但通常是约1000.
我已经对这个向量进行了排序(效果很好),排序后,我只想保留第一个50元素.
我试过了:
kpts.erase(kpts.begin() + 50, kpts.end());
Run Code Online (Sandbox Code Playgroud)
kpts我的矢量在哪里,表现太可怕了!大概是因为这种方式erase运作.
有没有办法只保留50向量的第一个元素?看起来应该是显而易见的,但我找不到办法做到这一点.
例如:
int foo()
{
static int i = 0;
return i++;
}
Run Code Online (Sandbox Code Playgroud)
该变量i仅0在第一次被初始化时foo被调用.这是否自动意味着在那里有一个隐藏的分支,以防止初始化不止一次发生?还是有更聪明的技巧来避免这种情况?
据我所知,decltype用于查询对象/变量的类型等.
来自维基百科上的示例,如下所示:
int i;
decltype(i) x3; // type is int
Run Code Online (Sandbox Code Playgroud)
我以为我可以这样做:
class A
{
public:
int a, b;
};
template<typename T>
struct IsClass
{
enum { Yes = std::is_class<T>::value };
enum { No = !Yes };
};
std::vector<A> v;
auto it = v.begin();
IsClass<decltype(it)::value_type>::Yes
Run Code Online (Sandbox Code Playgroud)
因为毕竟这条线是合法的:
IsClass<std::vector<A>::iterator::value_type>::Yes
Run Code Online (Sandbox Code Playgroud)
唉它不会编译,引用如下:error C2039: 'value_type' : is not a member of '全局命名空间''
关于为什么范围分辨率在这种情况下以decltype的形式表现出来的任何想法?
PS:如果它有任何区别我正在使用MSVC2012(没有 Nov CTP)
在有人问之前,是的,这是家庭作业的一部分,是的,我在问之前做了很多谷歌搜索.我花了最后一小时在谷歌上搜索了许多不同的关键词,但却找不到任何东西.
所以这里有一个问题:
什么是以下变量的定义是指:
class MyClass* myClass;?
我尝试了类似的代码,class MyClass* myClass = new MyClass();发现它只是创建一个指向新实例的指针MyClass.
那么,使用class前缀有什么好处?它有什么不同吗?
有人有关于它的一些资源的链接?我根本找不到任何东西(除了"类定义"之外,真的很难找到其他东西!).
非常感谢!
上下文:我正在尝试使用另一个窗口的屏幕截图将其提供给OpenCV.我在网上发现了一些应该能够将BITMAP转换为OpenCV可以使用的代码.不幸的是我遇到了一些麻烦.
问题:为什么bmBits属性/成员始终为null?(我也试过用PrintWindow而不是BitBlt,结果是一样的)
#include <iostream>
#include <string>
#include <Windows.h>
int main(int argc, char* argv[])
{
std::wstring windowName = L"Calculator";
RECT rect;
HWND hwnd = FindWindow(NULL, windowName.c_str());
if (hwnd == NULL)
{
return 0;
}
GetClientRect(hwnd, &rect);
HDC hdcScreen = GetDC(NULL);
HDC hdc = CreateCompatibleDC(hdcScreen);
HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
rect.right - rect.left, rect.bottom - rect.top);
SelectObject(hdc, hbmp);
PrintWindow(hwnd, hdc, PW_CLIENTONLY);
BITMAP bmp;
GetObject(hbmp, sizeof(BITMAP), &bmp);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 所以我正在阅读橙皮书(第3版),我在第9章中看到了一个关于不变限定符的段落.它说:
该不变预选赛指示编译器和链接忽略的表达和功能没有直接关系到输出的计算.
这段经文是在两段相似的代码片段之后发布的:
uniform mat4 MVPmatrix;
// ...
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
Run Code Online (Sandbox Code Playgroud)
和
uniform mat4 MVPmatrix;
// ...
invariant gl_Position;
in vec4 MCVertex;
// ...
a(); // does not modify gl_Position, MVP or MCVertex
// ...
// Transform vertex to clip space
gl_Position = MVP * MCVertex;
Run Code Online (Sandbox Code Playgroud)
然后这本书继续指出:
无论什么不相关的函数或表达式链接到着色器,第一种情况可以或可以不以完全相同的方式计算变换的位置.如果使用多遍算法多次渲染相同的几何体,这可能会导致渲染问题.
哪个让我困惑.如果a()决不影响计算变换位置所涉及的变量,那么计算将如何变化?(以及如何添加invariant帮助呢?).并且参考第一个引用,他们究竟是什么意思"忽略不相关的功能"?他们只是没有被处决?
在第二个例子中,缺点似乎没有像我期望的那样起作用.我错过了什么?
这里cons为列表添加了一个元素,这很棒.
1:[2,3]
Run Code Online (Sandbox Code Playgroud)
但是有了这个,它似乎将第一个元素放入列表x并将尾部放入列表xs:
let { myInt :: [Int] -> [Int] ; myInt (x:xs) = xs }
Run Code Online (Sandbox Code Playgroud)
我真的不明白为什么会发生这种情况,是否与递归有关?
提前致谢!
请考虑以下代码(仅用于演示目的):
#include <iostream>
int main()
{
char pixels[4][1280][720]; // Big enough to cause a stack overflow on my machine
for (unsigned int i = 0; i < 4; i++)
{
for (unsigned int j = 0; j < 1280; j++)
{
for (unsigned int k = 0; k < 720; k++)
{
pixels[i][j][k] = i + j + k;
}
}
}
std::cout << pixels[2][640][360];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
根据这个问题的答案,最大堆栈大小由visual studio设置.
假设它可以警告用户潜在的堆栈溢出,我是否正确?(我自己尝试了这个并没有得到警告)
PS:我问的唯一原因是因为我看到很多关于SO的问题可以通过这样的警告来防止(是的,我知道不是每个SO用户都使用VS).
我在下面的"C++编程语言,第4版",第17.5.1.3章中找到了代码
struct S2 {
shared_ptr<int> p;
};
S2 x {new int{0}};
void f()
{
S2 y {x}; // ‘‘copy’’ x
?y.p = 1; // change y, affects x
?x.p = 2; // change x; affects y
y.p.reset(new int{3}); // change y; affects x
?x.p = 4; // change x; affects y
}
Run Code Online (Sandbox Code Playgroud)
我不明白最后的评论,确实yp应该在reset()调用后指向一个新的内存地址,等等
?x.p = 4;
Run Code Online (Sandbox Code Playgroud)
应该让yp不变,不是吗?
谢谢