使用此代码:
int main()
{
try
{
throw -1;
}
catch (int& x)
{
std::cerr << "We caught an int exception with value: " << x << std::endl;
}
std::cout << "Continuing on our merry way." << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我们有:
/tmp$ ./prorgam.out
Continuing on our merry way
We caught an int exception with value: -1
Run Code Online (Sandbox Code Playgroud)
catch块如何读取-1为int&?我们无法为非常量左值引用赋值。
为什么第二条std::cout语句在第一条std::cerr语句之前执行?
的建议实施std::initializer_list的标准和C ++编程语言很简单。简单我的意思是没有什么奇怪的。
但是在 Compilers 的实现中事情变得复杂std::initializer_list,例如,GCC 有一个私有构造函数 for std::initializer_list,上面有一条注释说:'编译器可以调用私有构造函数。'。在这里eerorika回答:std::initializer_list是特别的。所以我在编译器源代码中寻找它:
我不明白为什么我们需要一个特殊的私有构造函数?前段时间我想转换std::vector<T>为std::initializer_list<T>.
考虑这个代码:
using func = int (*)(int, int);
template<func F>
void do_something(int first, int second) {}
int something(int first, int second) { return 42; }
void f()
{
constexpr auto function = something;
do_something<function>(10, 20);
}
Run Code Online (Sandbox Code Playgroud)
它是用 C++17 标准兼容编译器编译和运行的,但它在 C++11 标准下失败:
error: no matching function for call to ‘do_something<function>(int, int)’
17 | do_something<function>(10, 20);
Run Code Online (Sandbox Code Playgroud)
C++11 非类型模板参数和 C++17 非类型模板参数有什么区别?在 §14.1.4 [temp.param][n3690] 中:
非类型模板参数应具有以下(可选 cv 限定的)类型之一:
— 整数或枚举类型,
— 指向对象或函数的指针,— 指向对象的
左值引用或指向函数的左值引用,
— 指向成员,
——std::nullptr_t。
在 §17.1.4 [temp.param][n4713] 中:
非类型模板参数应具有以下(可选 cv 限定的)类型之一:
(4.1) …
我不知道如何解释:
namespace A
{
struct B
{
static void f()
{
}
};
}
int main()
{
A::B::B::B::B::B::B::B::B::B::B::f();
}
Run Code Online (Sandbox Code Playgroud)
为什么我可以这样做:
A::B::B::B::B::B::B::B::B::B::B::f();
Run Code Online (Sandbox Code Playgroud)
我不明白为什么会这样。
使用此代码:
void yield_sleep(void)
{
using namespace std::chrono;
static size_t thread_num;
auto start{high_resolution_clock::now()};
std::this_thread::yield();
auto end{high_resolution_clock::now()};
std::cout << thread_num++
<< "|Waiting for: "
<< duration_cast<microseconds>(end - start).count()
<< " ms."
<< std::endl;
}
int main(void)
{
std::vector<std::thread> tp(62434);
std::generate(tp.begin(), tp.end(), []() { return std::thread(yield_sleep); });
std::for_each(tp.begin(), tp.end(), [](auto& t) { t.join(); });
}
Run Code Online (Sandbox Code Playgroud)
程序创建 ~32718 线程并抛出异常:
terminate called after throwing an instance of 'std::system_error'
what(): Resource temporarily unavailable
Run Code Online (Sandbox Code Playgroud)
但是里面/proc/sys/kernel/threads-max的值是62434。有什么问题?为什么我的程序在创建线程期间抛出异常?
我是 QML 的初学者,并尝试在 QWdiget 中插入 QML 视图,但我不明白为什么它不起作用。
这是我的 qml 文件的一个简单示例(这不是真正的文件):
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.2
import QtQml.Models 2.1
ObjectModel {
id: itemModel
Rectangle {
color: "orange"
anchors.fill: parent
}
Rectangle {
color: "orange"
anchors.fill: parent
}
Rectangle {
color: "orange"
anchors.fill: parent
}
ListView {
id: my_list
anchors.fill: parent
model: itemModel
}
}
Run Code Online (Sandbox Code Playgroud)
这就是我在主窗口中加载它的方式:
QQuickView *view = new QQuickView();
QWidget *container = QWidget::createWindowContainer(view, this);
container->setMinimumSize(200, 200); …Run Code Online (Sandbox Code Playgroud) 我知道当我想将 C 代码链接为 C++ 中的 C 代码时,我应该使用extern "C". 但是使用以下代码:
/* file.h */
some (void)
{
return 10;
}
Run Code Online (Sandbox Code Playgroud)
extern "C"
{
#include "file.h"
}
#include <iostream>
int main (void)
{
std::cout << some() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我收到此编译时错误:
C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 defualt-int。
我该如何处理?
我MSVC2017在MS-Windows10.
编辑:我知道大多数声明具有显式返回类型的函数,但是我使用USBPcap和 USBPcap 声明了一些类似的函数。我如何在我自己的 C++ 程序中使用它?
我正在阅读德军总部 3D 代码,我遇到了ISPOINTER宏:
#define ISPOINTER(x) ((((uintptr_t)(x)) & ~0xffff) != 0)
Run Code Online (Sandbox Code Playgroud)
我知道我们有std::is_pointer,但是这个宏是如何工作的?我尝试并以奇怪的行为失败了,我无法解释为什么会发生这种情况:
#define ISPOINTER(x) ((((uintptr_t)(x)) & ~0xffff) != 0)
int main()
{
int* ptr;
int val;
if (ISPOINTER(ptr)) {
std::cout << "`ptr`: Is Pointer" << std::endl;
}
if (ISPOINTER(val)) {
std::cout << "`val`: Is Pointer" << std::endl;
}
}
Run Code Online (Sandbox Code Playgroud)
我没有任何输出,但如果我添加另一个指针:
#define ISPOINTER(x) ((((uintptr_t)(x)) & ~0xffff) != 0)
int main()
{
int* ptr;
int val;
int* ptr2;
if (ISPOINTER(ptr)) {
std::cout << "`ptr`: Is Pointer" << …Run Code Online (Sandbox Code Playgroud) 最近去用了std::unordered_map::erase,看到函数有一些重载:
iterator erase( const_iterator pos ); (1) (since C++11)
iterator erase( iterator pos ); (1) (since C++17)
iterator erase( const_iterator first, const_iterator last ); (2) (since C++11)
size_type erase( const key_type& key ); (3) (since C++11)
Run Code Online (Sandbox Code Playgroud)
在提到的函数返回值的描述中:
Return value
1-2) Iterator following the last removed element.
3) Number of elements removed.
Run Code Online (Sandbox Code Playgroud)
最后一个 (3),表示我们可以删除元素的数量。这是否意味着可以在地图上使用相同的键?
我正在阅读C++ Templates: The Complete Guide, 2th Edition,我看到了这个代码:
template<typename T1, typename T2>
std::common_type_t<T1, T2> max (T1 a, T2 b)
{
return b < a ? a : b;
}
Run Code Online (Sandbox Code Playgroud)
根据我从第 12 页读到的内容,我想问一下函数如何计算它想要返回的类型?在上面的例子中,max函数如何计算它想要返回的类型,在 T1 和 T2 之间选择?
我查看了 : ./gcc/libstdc++-v3/include/std/type_traits2115但无法弄清楚发生了什么。
我想要做什么:
我有很多typedef像这样的ed 函数指针:
typedef void (*voidVoid)();
typedef void (*voidInt)(int);
typedef void (*voidDouble)(double);
...
Run Code Online (Sandbox Code Playgroud)
我想做一个像这样的功能:
Type getFunctionPointer(const std::string& name);
Run Code Online (Sandbox Code Playgroud)
其中取函数指针的名称并返回相应的函数指针。在我找到templates之前,我认为这是不可能的。但我认为,std::commone_type_t正是在做我想做的事情。它接受一个变量并返回一个类型(这是该变量的类型)。
我该如何定义?我可以使用std::commone_type_t或更好的解决方案来实现它templates吗?