小编use*_*922的帖子

C++中模板特化的顺序

模板专业化在代码中出现的顺序是否会改变程序的含义?如果是这样,为什么呢?

例:

在源代码中的某个地方

// specialization A
...
// specialization B
...
Run Code Online (Sandbox Code Playgroud)

// specialization B
...
// specialization A
...
Run Code Online (Sandbox Code Playgroud)

这会产生相同的结果吗?

c++ templates generic-programming

14
推荐指数
2
解决办法
1587
查看次数

将编译器标志添加到CMakeLists.txt

我想使用最新版本的Boost库,并具有以下CMakeLists.txt文件的内容:

cmake_minimum_required (VERSION 3.0)
project (foo)
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -DBOOST_ERROR_CODE_HEADER_ONLY -lpthread")
# set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lpthread")

add_executable (first first.cpp)
Run Code Online (Sandbox Code Playgroud)

有了这个,我不断收到以下链接器错误:

对`pthread_detach的未定义引用

但是,如果我在不使用cmake的情况下编译代码,请使用以下命令:

g++ foo.cpp -std=c++11 -DBOOST_ERROR_CODE_HEADER_ONLY -lpthread
Run Code Online (Sandbox Code Playgroud)

它工作正常.

问题是如何使用cmake使其工作.当我通过设置CMAKE_CXX_FLAGS指定编译器标志时,为什么它不起作用?我想我可能不得不指定CMAKE_EXE_LINKER_FLAGS,但这样做根本没有帮助.

c++ boost pthreads cmake

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

C++,为vector :: end赋值?

假设我有一个向量v {1,2,3,4,5}.我想削减最后两个元素,所以我想我会做类似的事情

v.end() = v.begin() + 3;
Run Code Online (Sandbox Code Playgroud)

我们来看看这个片段:

std::vector<int> v {1,2,3,4,5};
std::cout << *(v.end()-1) << std::endl;
v.end() = v.begin() + 3;
std::cout << *(v.end()-1) << std::endl;
Run Code Online (Sandbox Code Playgroud)

在两种情况下都打印5.这是为什么?如果vector :: end返回一个迭代器,它不是一个右值?如果是这样,代码根本不应该编译.如果它是一个左值,为什么结束迭代器不会指向该元素v.begin() + 3

c++ iterator vector

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

实现unique_ptr的移动构造函数的问题

我正在尝试编写unique_ptr实现.我正在努力编写一个移动构造函数.这是我的问题:

  1. 当我将移动构造函数标记为时default,我的资源被删除两次,当我移动时指定一个指针(auto foo2 = std::move(foo);下面) - 为什么?
  2. 当我试图在移动构造函数中分配底层指针时*rhs = nullptr(参见下面的实现),编译器说*rhs是一个右值并且我不能为它分配任何东西.
  3. 最后,rhs.m_ptr = nullptr作品.为什么它不起作用,什么时候*rhs = nullptr不起作用?

我的代码:

#include <iostream>

namespace my
{
template <class T>
class unique_ptr
{
public:
    unique_ptr()
    {
        m_ptr = new T;
    }
    unique_ptr(const unique_ptr&) = delete;
    // move constructor
    unique_ptr(unique_ptr&& rhs)  // = default deletes m_ptr twice
    {
        m_ptr = *rhs;
        rhs.m_ptr = nullptr;  // *rhs = nullptr doesn't work (*rhs is an rvalue)
    } …
Run Code Online (Sandbox Code Playgroud)

c++ unique-ptr move-constructor move-semantics

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

作为参数传递的打印功能指针导致在屏幕上打印"1"

我一直在尝试使用函数指针,发现以下程序的行为相当神秘:

void foo(int(*p)())
{ std::cout << p << std::endl; }

int alwaysReturns6()
{ return 6; }

int main()
{
    foo(alwaysReturns6);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码在屏幕上打印数字"1".

我知道我应该像这样访问函数指针:( p()然后打印6),但是我仍然没有得到函数中使用的plain p*pmeans foo.

c++ function-pointers

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

将从std :: map获取的std :: pair引用传递给接受std :: pair引用的函数

编辑:第一个问题的答案是使用std :: pair.关于第二个的任何想法(标记为'奖金问题')?

使用以下代码:

#include <map>
#include <vector>

void foo(std::pair<int, int>& p)  // EDIT: it needs to be non-const
{}

int main()
{
    std::pair<int, int> p{1,2};
    foo(p);
    std::vector<std::pair<int, int>> v{{1,2}};
    for (auto& element : v)
    {
        foo(element);  // works fine
    }

    std::map<int, int> m{std::make_pair(1,2)};
    //std::map<int, int> m2{{1,2}};
    for (auto& element : m)  // the problematic loop
    {
        foo(element);
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在后者for循环中得到以下消息:

错误:从'std :: pair'类型的表达式初始化'std :: pair&'类型的引用无效

以及m2中的以下内容:

错误:从'std :: pair'类型的右值开始无效初始化'std :: pair&'类型的非const引用

这是为什么?

额外的问题: 我发现非常奇怪的是,当m2的初始化没有被注释掉并且for循环保持不变(其中仍有m并且m2从未使用过)时,错误消息从

错误:从'std :: pair'类型的表达式初始化'std …

c++ stdmap c++11

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