模板专业化在代码中出现的顺序是否会改变程序的含义?如果是这样,为什么呢?
例:
在源代码中的某个地方
// specialization A
...
// specialization B
...
Run Code Online (Sandbox Code Playgroud)
与
// specialization B
...
// specialization A
...
Run Code Online (Sandbox Code Playgroud)
这会产生相同的结果吗?
我想使用最新版本的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,但这样做根本没有帮助.
假设我有一个向量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?
我正在尝试编写unique_ptr实现.我正在努力编写一个移动构造函数.这是我的问题:
default,我的资源被删除两次,当我移动时指定一个指针(auto foo2 = std::move(foo);下面) - 为什么?*rhs = nullptr(参见下面的实现),编译器说*rhs是一个右值并且我不能为它分配任何东西.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) 我一直在尝试使用函数指针,发现以下程序的行为相当神秘:
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.
编辑:第一个问题的答案是使用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 …