考虑一下片段:
#include <unordered_map>
void foo(const std::unordered_map<int,int> &) {}
int main()
{
foo({});
}
GCC 4.9.2的话失败了,他的信息是:
map2.cpp:7:19: error: converting to ‘const std::unordered_map<int, int>’ from initializer list would use explicit constructor ‘std::unordere
struct Test {
bool active{true};
void threadedUpdate() {
std::this_thread::sleep_for(std::chrono::milliseconds(1));
if(!active) // crashes here after Test instance is destroyed
return;
}
Test() {
std::thread([this]{ while(true) threadedUpdate()
我有一个基类class A<T>和一个派生类class B : public A<string>。
class A有一个以整数作为唯一参数的构造函数和一个标准的复制构造函数。它没有无参数的默认构造函数(不是我定义的构造函数;我意识到编译器可能正在创建一个,这可能与我的问题有关)。
class B的构造函数如下所示:
B()
: A(37)
{
}
我得到的错误是:
编译器错误地将基构造器调用作为字段初始化
fileB.h: In constructor ‘B::B()’:
fileB.h:25: error: class ‘B’ does not have any f
与复制构造函数相比,我一直在研究移动构造函数。从我在堆栈溢出和其他信息来源上所读到的信息来看,关于如何“调用”它们更相关,但对于它们是否总是比复制构造器“总是”更有效率,我还没有找到一个明确的答案,也许我只是在寻找错误的东西。
无论如何,我之所以问这个问题,是因为下面的场景会使比复制构造函数更高效:
class Test {
std::string *name;
std::vector<std::string> *friends;
public:
Test() : name{nullptr}, friends{nullptr} {} // If not
为了保存对对象的引用,使用带&和非的std::shared_ptr有什么区别?
class A{};
class B
{
private:
std::shared_ptr<A>&obj; // or std::shared_ptr<A>obj;
public:
B(std::shared_ptr<A>r) : obj(r) {}
};
int main()
{
std::shared_ptr<A>a(new A());
std::unique_ptr<B>b(new B(a));
下面的代码基本上是在CPP参考中找到的variant上的示例的一个更“朴素”的版本。它定义了一个std::variant类型(第1行),并使用std::visit遍历该类型的向量。这里,我在std::visit函数中使用了一个函数器(第2行),试图更好地理解std::visit是如何工作的。 最让我困惑的是第4行和第5行。看起来,带大括号的Print{}或带括号的Print()都可以作为std::visit函数的第一个参数。后者,即Print(),是一个实例化,因此提供了一个对象作为第一个参数,这是可以理解的。我不太明白为什么前者,Print{},也能工作。有没有人能解释一下这个特性? us
接下来我要写的几行来自“C++标准库-教程和参考”一书。
使用标准输入初始化:
//read all integer elements of the deque from standard input
std::deque<int> c((std::istream_iterator<int>(std::cin)),
(std::istream_iterator<int>()));
这里不要忘记初始化器参数周围的额外括号。否则,这个表达式会做一些非常不同的事情,您可能会在下面的语句中得到一些奇怪的警告或错误。考虑在不加括号的情况下编写语句:
s
我要问的一个简单的概念例子:
#include<iostream>
#include<string>
// Example tempate class scenario
template<int N>
class Example
{
switch (N)
{
case 0:
Example() { std::cout << "Interesting..." << std::endl; }
break;
case 1:
Example