在C++ 11中,这个:
const std::vector<int>& f() {
static const std::vector<int> x { 1, 2, 3 };
return x;
}
Run Code Online (Sandbox Code Playgroud)
是线程安全的.但是,由于这个额外的线程安全保证,在第一次(即初始化)之后调用此函数是否会有额外的惩罚?我想知道函数是否会慢于使用全局变量的函数,因为它必须获取一个互斥锁来检查它是否在每次被调用时被另一个线程初始化,或者其他什么.
我不擅长C++,所以这可能是一个新手错误.我正在尝试创建一个异构链表类型,其中每个节点的类型和列表其余部分的类型在每个节点中都是已知的.
这是一个SSSCE:
#include <utility>
template<typename T, typename... Rest>
struct hnode {
T data;
hnode<Rest...>* next;
};
template<typename T>
struct hnode<T> {
T data;
std::nullptr_t next;
};
template<typename T, typename... Rest>
hnode<T> hcons(T&& val, std::nullptr_t) {
return { std::forward<T>(val), nullptr };
}
template<typename T, typename... Rest>
hnode<T, Rest...> hcons(T&& val, hnode<Rest...>& next) {
return { std::forward<T>(val), &next };
}
int main() {
hnode<int> three = hcons(1, nullptr);
auto two = hcons("hi", three);
}
Run Code Online (Sandbox Code Playgroud)
但是,GCC给了我这个代码的错误:
test.cc: In function ‘int main()’:
test.cc:28:29: error: …Run Code Online (Sandbox Code Playgroud) 在包含Haskell的大多数函数式语言中,定义链表类型本身就很简单:
data List a = Nil | Cons a (List a)
Run Code Online (Sandbox Code Playgroud)
但是,我在Haskell教程中找不到任何地方,我已经看到它展示了如何定义自己的数组类型.如何定义一个数组数据类型的方式我们从无到有的定义我们自己的列表?
注意:我的问题不是关于如何在Haskell中使用数组; 理论上,它只是如何定义一个自己的数组类型,就像所做的那样List,而不使用任何类型的库或内置功能.