从C++ 11开始,我们可以写:
vector<int> v{1, 2, 3, 4};
for (auto x : v)
{
cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)
根据Essentials of Modern C++ Style,以下代码很快在C++中也是合法的:
vector<int> v{1, 2, 3, 4};
for (x : v)
{
cout << x << endl;
}
Run Code Online (Sandbox Code Playgroud)
这个功能是否可以在C++ 17或C++ 20中使用?
我有一个多线程应用程序,它大量std::cout
用于日志记录而没有任何锁定.在这种情况下,如何轻松添加锁机制以使std::cout
线程安全?
我不想搜索每次出现std::cout
并添加一行锁定代码.这太乏味了.
有更好的做法吗?
我的项目只包含两个源文件:
a.cpp:
const int n = 8;
Run Code Online (Sandbox Code Playgroud)
b.cpp:
extern const int n;
int main()
{
// error LNK2001: unresolved external symbol "int const n" (?n@@3HB)
int m = n;
}
Run Code Online (Sandbox Code Playgroud)
我知道有几种方法可以使它工作; 但是,我只是想知道为什么它不起作用?
你能否在某些情况下给我一个说明性的例子来证明以下陈述是有用和必要的?
AnyTypeMovable v;
AnyTypeMovable&& r = move(v);
Run Code Online (Sandbox Code Playgroud) 我的编译器是最新的VC++ 2013 RC.
int f(bool b)
{
return {}; // OK
return b ? 1 : { }; // C2059: syntax error : '{'
return b ? 1 : {0}; // C2059: syntax error : '{'
return b ? {1} : {0}; // C2059: syntax error : '{'
}
Run Code Online (Sandbox Code Playgroud)
为什么braced-init-list不能用于三元运算符?
这种行为是否被C++标准定义为不正确,或仅仅是VC++编译器的错误?
class A
{
public:
A() = default;
A(const A&) = delete;
};
class A
{
public:
A() = default;
private:
A(const A&) = delete;
};
Run Code Online (Sandbox Code Playgroud)
在任何情况下,这两个定义是否始终相同?
C++ 11提供了两种类型的特征模板类:std::is_integer
和std::is_integral
.但是,我不能说出它们之间的区别.
什么类型,比如T,可以成std::is_integer<T>::value
真并做出std::is_integral<T>::value
错误?
#include <cstdlib>
#include <thread>
#include <chrono>
#include <iostream>
using namespace std;
using namespace std::literals;
struct A
{
int n_ = 0;
A(int n) : n_(n) { cout << "A:" << n_ << endl; }
~A() { cout << "~A:" << n_ << endl; }
};
A a1(1);
int main()
{
std::thread([]()
{
static A a2(2);
thread_local A a3(3);
std::this_thread::sleep_for(24h);
}).detach();
static A a4(4);
thread_local A a5(5);
std::this_thread::sleep_for(1s);
std::exit(0);
}
Run Code Online (Sandbox Code Playgroud)
我的编译器是clang 5.0
用-std=c++1z
.
输出如下:
Run Code Online (Sandbox Code Playgroud)A:1 A:2 A:4 A:5 …
众所周知,C++标准定义了两种形式的全局分配函数:
void* operator new(size_t);
void* operator new[](size_t);
Run Code Online (Sandbox Code Playgroud)
而且,C++标准草案(18.6.1.2 n3797)说:
227)运算符new或operator delete不直接负责注意数组的重复次数或元素大小.这些操作在数组new和delete表达式的其他位置执行.但是,数组新表达式可以将operator参数增加到operator new以获得存储补充信息的空间.
让我困惑的是:
如果我们void* operator new[](size_t);
从标准中删除,而只是使用该void* operator new(size_t)
怎么办?定义冗余全局分配函数的基本原理是什么?
以下是C++ std文档.文件号是N3721,取代了旧的N3634.
显然,跟踪给定主题的旧文档很容易.
但是,我的问题是:
如何跟踪给定主题的新文档?
例如,如果N3721被新文档取代,如何跟踪新文档?
c++ ×10
c++11 ×7
standards ×4
const ×1
constructor ×1
declaration ×1
destructor ×1
extern ×1
iostream ×1
locking ×1
logging ×1
new-operator ×1
overloading ×1
scope ×1
type-traits ×1
visual-c++ ×1