小编ein*_*ica的帖子

当析构函数可能抛出异常时,为什么 std::vector 会进行复制构造而不是移动构造?

考虑以下程序:

#include <vector>
#include <iostream>

class A {
    int x;
public:
    A(int n)          noexcept : x(n)       { std::cout << "ctor with value\n"; }
    A(const A& other) noexcept : x(other.x) { std::cout << "copy ctor\n"; }
    A(A&& other)      noexcept : x(other.x) { std::cout << "move ctor\n"; }
    ~A()                                    { std::cout << "dtor\n"; } // (*)
};

int main()
{
    std::vector<A> v;
    v.emplace_back(123);
    v.emplace_back(456);
}
Run Code Online (Sandbox Code Playgroud)

如果我运行该程序,我会得到(GodBolt):

ctor with value
ctor with value
move ctor
dtor
dtor
dtor
Run Code Online (Sandbox Code Playgroud)

……这符合我的预期。但是,如果在线(*)我将析构函数标记为可能抛出,那么我会 …

c++ copy-constructor stdvector move-semantics

34
推荐指数
2
解决办法
1858
查看次数

如何使用BOOST_FOREACH同时迭代两个向量?

我想用BOOST FOREACH复制以下内容

std::vector<int>::const_iterator i1;
std::vector<int>::const_iterator i2;
for( i1 = v1.begin(), i2 = v2.begin();
     i1 < v1.end() && i2 < v2.end();
     ++i1, ++i2 )
{
     doSomething( *i1, *i2 );
}
Run Code Online (Sandbox Code Playgroud)

c++ boost iterator boost-foreach

33
推荐指数
3
解决办法
2万
查看次数

Cygwin目前的完整安装大小是多少?

我在网上发现的每个来源都表示Cygwin的完整安装需要1 GB以上,但我的只有100 MB.我很确定我从镜像服务器上下载了所有东西,但是安装花了不到5分钟就完成了而不是几个小时,因为我预计它会安装千兆字节的软件.

Cygwin在2012〜2013年期间是否进行了大规模的清理,或者我在安装中做错了什么?

windows cygwin diskspace

33
推荐指数
3
解决办法
4万
查看次数

在gcc中,C++ 1z/C++ 17支持的状态是什么?

Clang有一个很好的页面描述了C++ 1z/C++ 17特性支持的项目状态(以及C++ 11和C++ 14,它是同一页面).

g ++有一个关于C++ 14特性的页面,但我找不到任何关于C++ 17/C++ 1z的内容.这是否正在进行,但只是没有出现在网络上?对于5.0版?

c++ gcc clang++

33
推荐指数
3
解决办法
3万
查看次数

如何在可变参数模板函数中使用source_location?

C ++ 20功能std::source_location用于捕获有关调用函数的上下文的信息。当我尝试将其与可变参数模板函数一起使用时,遇到一个问题:我看不到放置source_location参数的地方。

以下操作无效,因为可变参数必须在末尾:

// doesn't work
template <typename... Args>
void debug(Args&&... args,
           const std::source_location& loc = std::source_location::current());
Run Code Online (Sandbox Code Playgroud)

以下内容也不起作用,因为调用者将被介于两者之间的参数所困扰:

// doesn't work either, because ...
template <typename... Args>
void debug(const std::source_location& loc = std::source_location::current(),
           Args&&... args);

// the caller will get confused
debug(42); // error: cannot convert 42 to std::source_location
Run Code Online (Sandbox Code Playgroud)

可以在可变参数模板中无缝使用的评论中告诉我std::source_location,但是我很难弄清楚该如何做。如何std::source_location与可变参数模板函数一起使用?

c++ default-arguments variadic-templates c++20 std-source-location

33
推荐指数
4
解决办法
937
查看次数

找出C++对象是否可调用

是否有可能写出一个类型特征,比如说is_callable<T>一个对象是否已operator()定义?如果调用运算符的参数事先已知,则很容易,但在一般情况下则不行.当且仅当至少有一个重载调用运算符被定义时,我希望特征返回true.

这个问题是相关的,并且有一个很好的答案,但它不适用于所有类型(仅限于 - 可int转换类型).此外,std::is_function工作,但只适用于正确的C++函数,而不是函子.我正在寻找更通用的解决方案.

c++ metaprogramming traits type-traits

32
推荐指数
4
解决办法
8144
查看次数

CUDA应用程序在几秒钟后超时和失败 - 如何解决这个问题?

我注意到CUDA应用程序在失败并退出之前往往有5-15秒的粗略最大运行时间.我意识到没有CUDA应用程序运行那么久是理想的,但假设它是使用CUDA的正确选择,并且由于每个线程的顺序工作量必须运行那么长,有没有办法延长这个时间或者绕过它?

timeout cuda gpgpu gpu-programming

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

C++中最接近定义类的超类的东西是什么?

假设我有班级

class A {
protected:
    int x,y;
    double z,w;

public:
    void foo();
    void bar();
    void baz();
};
Run Code Online (Sandbox Code Playgroud)

在我的代码和其他代码中定义和使用.现在,我想写一些可以很好地在A上运行的库,但它实际上更通用,并且能够操作:

class B {
protected:
    int y;
    double z;

public:
 void bar();
};
Run Code Online (Sandbox Code Playgroud)

我确实希望我的库是通用的,所以我定义了一个B类,这就是它的API.

我希望能够告诉编译器 - 不是在我不再控制的A的定义中,而是在其他地方,可能在B的定义中:

请注意,请尝试将其B视为超类A.因此,特别是,将它放在内存中,这样如果我重新解释A*为a B*,我的代码期望B*s会起作用.并请然后实际接受A*B*(和A&作为B&等等).

在C++中,我们可以通过另一种方式执行此操作,即如果B是我们无法控制的类,则可以执行"子类已知类"操作class A : public B { ... }; 我知道C++没有相反的机制 - "通过新的B类超类化已知的A类".我的问题是 - 这个机制最接近可实现的近似值是多少?

笔记:

  • 这都是严格的编译时间,而不是运行时.
  • 可以有没有任何的变化class A.我只能修改B知道两者A和的代码的定义和代码 …

c++ idiomatic subclassing superclass

31
推荐指数
3
解决办法
2377
查看次数

cuda.h,cuda_runtime.h,cuda_runtime_api.h之间的区别

我开始使用CUDA进行编程,在某些示例中,我找到了包含文件cuda.h,cuda_runtime.hcuda_runtime_api.h包含在代码中.有人可以向我解释这些文件之间的区别吗?

cuda header-files

30
推荐指数
2
解决办法
2万
查看次数

负NaN不是NaN?

在编写一些测试用例时,有些测试会检查NaN的结果.

我尝试使用std::isnan但断言错误:

Assertion `std::isnan(x)' failed.
Run Code Online (Sandbox Code Playgroud)

打印出值后x,结果显示它是负NaN(-nan),在我的情况下是完全可以接受的.

在尝试使用NaN != NaN和使用的事实之后assert(x == x),编译器给我一个'恩惠'并优化断言.

制作我自己的isNaN功能也正在优化.

如何检查NaN -NaN的相等性?

c++ nan fast-math

29
推荐指数
2
解决办法
9713
查看次数