小编Gha*_*ani的帖子

投掷和捕捉整数是如何工作的?

使用此代码:

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块如何读取-1int&?我们无法为非常量左值引用赋值。

为什么第二条std::cout语句在第一条std::cerr语句之前执行?

c++ exception try-catch

15
推荐指数
2
解决办法
649
查看次数

为什么我们需要 std::initializer_list 的私有构造函数?

的建议实施std::initializer_list标准C ++编程语言很简单。简单我的意思是没有什么奇怪的。
但是在 Compilers 的实现中事情变得复杂std::initializer_list,例如,GCC 有一个私有构造函数 for std::initializer_list,上面有一条注释说:'编译器可以调用私有构造函数。'。在这里eerorika回答:std::initializer_list是特别的。所以我在编译器源代码中寻找它:

铛:

海湾合作委员会:

我不明白为什么我们需要一个特殊的私有构造函数?前段时间我想转换std::vector<T>std::initializer_list<T>.

c++ stdinitializerlist

12
推荐指数
1
解决办法
167
查看次数

C++17 和 C++11 中的非类型模板参数有什么区别?

考虑这个代码:

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) …

c++ language-lawyer non-type c++11 c++17

11
推荐指数
1
解决办法
180
查看次数

A::B::B::B::B...B::f() 对吗?为什么我可以这样做?

我不知道如何解释:

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)

我不明白为什么会这样。

c++ namespaces language-lawyer

6
推荐指数
1
解决办法
119
查看次数

为什么创建的线程数小于thread-max?

使用此代码:

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。有什么问题?为什么我的程序在创建线程期间抛出异常?

c++ multithreading gcc gcc9

5
推荐指数
0
解决办法
253
查看次数

如何在 QWidget 中插入 QML 视图

我是 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)

qt qwidget qml qtquick2

4
推荐指数
1
解决办法
8142
查看次数

在带有 extern "C" 的 C++ 中使用 C 代码的问题

我知道当我想将 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。

我该如何处理?
MSVC2017MS-Windows10.

编辑:我知道大多数声明具有显式返回类型的函数,但是我使用USBPcap和 USBPcap 声明了一些类似的函数。我如何在我自己的 C++ 程序中使用它?

c c++ extern-c

4
推荐指数
2
解决办法
228
查看次数

如何判断变量是否为指针?

我正在阅读德军总部 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)

c++

4
推荐指数
1
解决办法
155
查看次数

为什么 `std::unordered_map::erase(key_type const&amp;)` 返回删除元素的数量?

最近去用了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++ unordered-map

3
推荐指数
1
解决办法
90
查看次数

如何从 C++ 函数返回一个类型?

我正在阅读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吗?

c++ templates function return-type

1
推荐指数
1
解决办法
346
查看次数