#include <initializer_list>
struct Obj {
int i;
};
Obj a, b;
int main() {
for(Obj& obj : {a, b}) {
obj.i = 123;
}
}
Run Code Online (Sandbox Code Playgroud)
该代码无法编译,因为来自的值initializer_list {a, b}被当作const Obj&,并且不能绑定到非const引用obj。
是否有一种简单的方法可以使类似的构造工作,即遍历像like a和bhere 这样的不同变量中的值。
class A {
public:
virtual void f() = 0;
};
class B : public A {
public:
void f() final override { };
};
int main() {
B* b = new B();
b->f();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,编译器是否仍需要执行v表查找b->f();,或者是否可以B::f()直接调用,因为它已被标记final?
请不要与标题混淆,因为它已被某人询问,但不同的背景
Visual C++编译器(VS2008)中的以下代码未编译,而是抛出此异常:
std::ifstream input (fileName);
while (input) {
string s;
input >> s;
std::cout << s << std::endl;
};
Run Code Online (Sandbox Code Playgroud)
但是这个代码在cygwin g ++中编译得很好.有什么想法吗?
C++有时使用后缀_type上类型定义(例如std::vector<T>::value_type),有时也被_t(例如std::size_t),或没有后缀(正常的类,并且也像类型定义std::string这是真的std::basic_string<...>)
什么时候使用哪个名称有什么好的约定?
我需要将矩阵中的所有元素相加.我用过这个功能
sum(sum(A));
Run Code Online (Sandbox Code Playgroud)
在matlab中.哪个A是尺寸为300*360的矩阵.我想在OpenCV中实现相同的功能.我用过这样的东西.
double s=cv::sum(cv::sum(A));
Run Code Online (Sandbox Code Playgroud)
但是有错误显示无法将标量转换为双倍.如何解决这个问题?
如何在OS X上使用Swift/Cocoa获取唯一的临时文件路径?Cocoa似乎没有为此提供函数,只NSTemporaryDirectory()返回临时目录的路径.使用BSD mktemp函数需要一个可变的C字符串作为参数.
以下代码似乎在Clang ++和GCC上正常工作:
#include <vector>
class A {
private:
int i;
std::vector<A> children;
public:
A& add();
};
A& A::add() { children.emplace_back(); return children.back(); }
int main() {
A a;
A& a2 = a.add();
}
Run Code Online (Sandbox Code Playgroud)
std::vector<A>声明数据成员时,A仍然是不完整的类型.同样在使用std::vector<B>和B只向前声明class B;.它应该工作,std::vector因为它只包含一个指针A.
这是保证工作还是未定义的行为?
根据标准,在C++中始终是未定义的行为,例如,float*指向与a 相同的内存位置int*,然后从它们读/写.
在我的应用程序中,可以有一个填充32位整数元素的缓冲区,它被32位浮点元素覆盖.(它实际上包含一个图像的表示,它由GPU内核在多个阶段进行转换,但是也应该有一个主机实现执行相同的处理,以进行验证.)
该程序基本上这样做(不是实际的源代码):
void* buffer = allocate_buffer(); // properly aligned buffer
static_assert(sizeof(std::int32_t) == sizeof(float), "must have same size");
const std::int32_t* in = reinterpret_cast<const std::int32_t*>(buffer);
float* out = reinterpret_cast<float*>(buffer);
for(int i = 0; i < num_items; ++i)
out[i] = transform(in[i]);
Run Code Online (Sandbox Code Playgroud)
有没有办法reinterpret_cast在C++标准中明确定义指针大小写,而不需要为整个缓冲区做额外的内存副本,或者额外的每个元素副本(例如std::bit_cast)?
在C++ 11中,可以通过声明使外部(公共)可以访问私有基类的公共成员using.例如
class A {
private:
int i = 2;
public:
void f() { i = 3; }
friend bool operator==(const A& l, const A& r) { return l.i == r.i; }
};
class B : private A {
public:
using A::f;
};
int main() {
B b, b2;
b.f();
}
Run Code Online (Sandbox Code Playgroud)
b.f()因为using A::f在定义中是可能的B.
是否有可能编写一个类似的声明,它可以使友元函数的up-cast B&成为A&可能operator==(A&, A&),以便b == b2可以调用main()?