标签: std

使用Libc ++未定义的引用与Clang进行编译

第一对夫妇太长,无法参考.当我尝试clang++ -stdlib=libc++ ../main.cc ...使用SVN中的clang和libc ++ 进行编译时,我收到此错误.

error: undefined reference to 'typeinfo for char const*'
error: undefined reference to '__cxa_allocate_exception'
error: undefined reference to '__cxa_throw'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_begin_catch'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_rethrow'
/tmp/cc-pbn00y.o:../main.cc:function std::__1::deque<double, std::__1::allocator<double> >::__add_back_capacity(): error: undefined reference to '__cxa_end_catch'
/tmp/cc-pbn00y.o(.eh_frame+0xbd3): error: undefined reference to '__gxx_personality_v0'
Run Code Online (Sandbox Code Playgroud)

解决方案:感谢其中一个答案,我知道解决方案.libc ++本身不能像libstdc ++那样使用,它必须与libc ++ abi一起链接.但是,libc ++ abi尚未完成,因此目前使用libc ++似乎有些不完整,但它仍然是我完成时的首选.

更新2012年5月26日: libc ++ abi现在已经完成了C++,我已经成功地使用了clang ++ clang++ -std=c++11 -stdlib=libc++ …

c++ std clang undefined-reference libc++

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

如何在成员函数上使用std :: async?

如何在成员函数上运行std :: async调用?

例:

class Person{
public:
    void sum(int i){
        cout << i << endl;
    }
};

int main(int argc, char **argv) {
    Person person;
    async(&Person::sum,&person,4);
}
Run Code Online (Sandbox Code Playgroud)

我想调用sum async.

Person p;
call async to p.sum(xxx)
Run Code Online (Sandbox Code Playgroud)

我没弄明白我是否能用std :: async做到这一点.不想使用提升.寻找一线异步呼叫方式.

c++ multithreading std c++11

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

std :: tuple是如何实现的?

我想知道在C++ 0x的标准库中如何实现元组.我试着阅读libstdc ++手册中的描述,然后阅读模板列表,但是很难理解它是如何工作的,特别是在阅读代码时.

有人能用几句话解释我的元组实现的想法吗?我想知道这一点,因为我想在我的代码中使用元组,我想了解它是如何工作的以及它带来了什么类型的开销(仅扩展编译时间,对内存执行许多复制操作,在构造函数中执行许多其他函数)等).

c++ tuples std c++11

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

什么`在类方法实现的主体内使用std :: swap`意味着什么?

在一些c ++实践中,我试图学习并采用复制交换习语,对这个问题进行彻底的解释:复制交换习语.

但我发现了一些我从未见过的代码:using std::swap; // allow ADL在这个例子中

class dumb_array
{
public:
    // ...

    void swap(dumb_array& pOther) // nothrow
    {
        using std::swap; // allow ADL    /* <===== THE LINE I DONT UNDERSTAND */

        swap(mSize, pOther.mSize); // with the internal members swapped,
        swap(mArray, pOther.mArray); // *this and pOther are effectively swapped
    }
};
Run Code Online (Sandbox Code Playgroud)
  1. using std::swap;在函数实现的主体内部意味着什么?
  2. ADL是什么意思?

c++ stl using std argument-dependent-lookup

26
推荐指数
2
解决办法
5310
查看次数

C++标准措辞:"通过范围内的所有迭代器"是否意味着顺序性?

这个SO问题引发了std::generate对标准的讨论和保证.特别是,你可以使用具有内部状态的函数对象并依赖于generate(it1, it2, gen)调用gen(),存储结果*it,gen()再次调用,存储*(it + 1)等,或者它可以从后面开始,例如?

标准(n3337,§25.3.7/ 1)说明了这一点:

效果:第一个算法调用函数对象,gen并通过范围内的所有迭代器分配gen的返回值[first,last).第二个算法调用函数对象gen并通过范围内的所有迭代器分配gen的返回值,[first,first + n)如果n是正数,则不执行任何操作.

似乎没有保证排序,特别是因为其他段落具有更强的措辞,例如std::for_each(效果:适用f于取消引用范围中的每个迭代器的结果[first,last),从第一个开始并继续到last - 1.如果我们从字面上理解它,它只是保证从开始到first结束last- 不保证两者之间的排序.

但是:无论微软Apache的C++标准库既给那些需要的评价是连续的文档页面的例子.libc ++(in algorithm)和libstdc ++(in bits/stl_algo.h)都以这种方式实现它.此外,如果generate没有这种保证,您将失去许多潜在的申请.

目前的措辞是否意味着顺序性?如果没有,这是委员会成员的监督还是故意的?

(我很清楚,没有很多人能够提供有关这个问题的深刻答案,而不仅仅是推测或讨论,但我认为,根据SO指南,这并不能使这个问题"没有建设性".)


感谢@juanchopanza指出这个问题,并引用了我关于的段落for_each.

c++ standards std c++11

26
推荐指数
2
解决办法
466
查看次数

如何在没有boost :: timer的情况下以毫秒为单位计时

我正在使用boost 1.46,它不包括boost :: timer,还有什么方法可以计算我的功能.

我目前正在这样做:

time_t now = time(0);
<some stuff>
time_t after = time(0);

cout << after - now << endl; 
Run Code Online (Sandbox Code Playgroud)

但它只是在几秒钟内给出答案,所以如果函数小于1,则显示0.

谢谢

c++ boost timer timing std

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

std::pair 内的初始化列表

这段代码:

#include <iostream>
#include <string>

std::pair<std::initializer_list<std::string>, int> groups{ { "A", "B" }, 0 };

int main()
{
    for (const auto& i : groups.first)
    {
        std::cout << i << '\n';
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编译但返回段错误。为什么?

在 gcc 8.3.0 和在线编译器上测试。

c++ std std-pair

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

为什么 C++ 标准中没有并行的“std::accumulate”?

std::accumulate我认为C++ 标准中没有并行版本是令人困惑的。在我看来,并行实现它是微不足道的,例如基于 OpenMP 或 SIMD 指令。std::reduce有人对为什么标准委员会选择引入but not的并行版本有一个很好的解释吗std::accumulate?是因为迭代器类型不同吗?

c++ parallel-processing std accumulate c++17

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

std :: list :: splice和其他列表容器的复杂性

我有一些代码处理各种std :: list对象,我目前正在使用一种非常低效的方法在它们之间传输内容(我正在迭代一个列表的任意部分,并逐个将元素移动到第二个列表).我之前写过这段代码之前我才知道std :: list :: splice函数,我现在打算用我的代码替换它,例如:

list<string> list1, list2;

list1.push_back("a");
list1.push_back("b");
list1.push_back("c"); // list1: "a", "b", "c"

list<string>::iterator iterator1 = list1.begin();
iterator1++: // points to "b"

list2.push_back("x");
list2.push_back("y");
list2.push_back("z"); // list2: "x", "y", "z"

list<string>::iterator iterator2 = list2.begin();
iterator2++; // points to "y"

list1.splice(iterator1, list2, iterator2, list2.end());

// list1: "a", "y", "z", "b", "c"
// list2: "x"
Run Code Online (Sandbox Code Playgroud)

我有一个关于拼接功能复杂性的问题.根据这个消息来源:

http://www.cplusplus.com/reference/stl/list/splice/

它应该在拼接的第一个和最后一个元素之间的范围内具有线性复杂度(在我的示例中为iterator2和list2.end()),并且源表明这是因为迭代器前进.我可以忍受这个,但我一直希望不断复杂.

我的假设(在我找到此源之前)是splice函数执行如下操作:

  1. 切断"x"和"y"之间的链接
  2. 切断"z"和list2.end()之间的链接
  3. 形成"x"和list2.end()之间的链接
  4. 断开"a"和"b"之间的联系
  5. 形成"a"和"y"之间的联系
  6. 在"y"和"b"之间形成一个链接

从而恢复两个列表以完成链.

然后,相同的原则将适用于任意大小的列表.我不确定我看到哪里需要splice函数来推进任何迭代器,因为我为它提供了完成它所需要的所有迭代器.

所以我的问题是,C++规范如何解决这个问题?它是否仅在接头的起点和终点处断开并重新形成链路,还是逐个通过每个链路前进?如果是后者,那么任何其他列表容器(例如来自QT)是否提供前者?我的代码驻留在模拟程序的内部循环中,因此赋予它恒定而不是线性复杂性将是非常有价值的.

c++ qt list std

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

在C++ 20中,不再允许在std中为程序定义类型专门化函数模板吗?

来自cppreference.com的报价:

添加模板特化

允许为任何标准库添加模板特化(从C++ 20开始)| 模板到命名空间std只有当声明依赖于至少一个程序定义的类型并且特化满足原始模板的所有要求时,除非禁止这样的特化.

是否意味着,从C++ 20开始,将std不再允许将函数模板的特化添加到用户定义类型的命名空间中?如果是这样,它意味着许多现有代码可能会破坏,不是吗?(在我看来,这是一种"激进"的改变.)此外,它会向这些代码注入未定义的行为,这不会触发编译错误(警告有希望).

c++ std template-specialization function-templates c++20

25
推荐指数
2
解决办法
1497
查看次数