根据此处的讨论,我已向Ubuntu开发人员报告了一个错误。
编译以下示例c ++程序时:
#include <cmath>
#include <stdio.h>
int main()
{
printf("%f\n", std::cosf(0.0f));
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息: error: ‘cosf’ is not a member of ‘std’
包含math.h和使用非命名空间版本可以正常工作。到底是怎么回事?
我在Ubuntu 19.04上使用g ++ 8.3.0-6ubuntu1。
我正在与 g++ --std=c++17 test.cpp
考虑以下结构,std::optional其中包含一个绝对具有“正常”默认构造函数的类型。
#include <optional>
#include <string>
struct Foo
{
Foo() = default;
const std::optional<std::string> m_value;
};
bool function()
{
Foo foo;
return bool(foo.m_value);
}
Run Code Online (Sandbox Code Playgroud)
使用 clang 9 编译以下内容(使用系统的默认值libstdc++,对于它的 gcc 8)会给出一个意外警告:
<source>:6:5: warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
Foo() = default;
^
<source>:7:38: note: default constructor of 'Foo' is implicitly deleted because field 'm_value' of const-qualified type 'const std::optional<std::string>' (aka 'const optional<basic_string<char> >') would not be initialized
const std::optional<std::string> m_value;
^
Run Code Online (Sandbox Code Playgroud)
Foo foo;由于它使用了所述已删除的构造函数,因此也存在硬错误。
我有一个STL对象的应用程序,用作插件编写器的C++接口的一部分.
我知道兼容性的最佳选择是使用C接口,但目前不可行.
我知道libstdc ++中从GCC 3.4到4.8的所有内容在ABI方面都是高度兼容的.
因此,例如,如果我使用GCC 4.1进行编译,并且插件供应商编写使用GCC 4.7编译的代码,那么禁止角落情况一切都将在具有与GCC 4.7或更高版本相对应的libstdc ++版本的平台上完成,前提是STL用法是只有.so的内部,以及外部的.so界面使用的是纯粹的C,但对我来说情况并非如此.
所以,我很好奇关于作为插件接口的一部分使用的STL类的情况.我可以安全地在未使用相同编译器版本编译的共享对象之间传递STL对象(例如4.1和4.8)吗?如果人们使用不同的编译器选项,是否有任何关于如何编译和解决模板的问题需要注意什么?
我怀疑它会有问题.然而,GCC人员有可能以某种方式完成这项工作.
对于这个问题,我只对pre-C++ 11编译和链接感兴趣.我也只对使用GCC的Linux和Mac OS X感兴趣.
尝试编译我的程序时,我有一个未解决的符号错误,抱怨它无法找到__dso_handle.这个函数通常定义在哪个库中?
以下结果是否nm on libstdc++.so.6意味着包含它?
我试图链接它,但错误仍然发生.
nm libstdc++.so.6 | grep dso
00000000002fc480 d __dso_handle
Run Code Online (Sandbox Code Playgroud) 我正在编写一些C++ 11代码,这些代码对其性质的假设std::string是有效的,但代表了在C++ 11中改变的行为.在早期,libstdc ++的basic_string实现符合98/03的要求,但不符合更严格的C++ 11要求.
据我了解,libstdc ++修复了问题basic_string.问题是人们使用的库有许多版本没有实现此修复.而且我的代码可能会以许多不愉快的方式无声地失败.
我想有一个static_assert火,如果用户尝试编译我的图书馆对的libstdc ++的那些不符合的版本.如何检测版本,同样重要的是,我应该查找哪个版本?
我正在为标准的C++ 11引擎寻找一组可移植的发行版,比如`std :: mt19937'(参见http://en.cppreference.com/w/cpp/numeric/random).
引擎实现一致地执行(即在不同平台上生成相同的序列 - 使用Clang和MSVC进行测试),但是分布似乎在不同平台上以不同方式实现.
因此,即使引擎产生相同的序列,似乎分布(例如std::normal_distribution<double>)在不同的平台上不使用相同数量的样本(即产生不同的结果),这在我的情况下是不可接受的.
可能有一个第三方库我可以使用它遵循C++ 11随机模板,但这将在流行的平台上提供一致的值(看看GCC,MSVC和Clang/llvm的支持).
我到目前为止看到的选项是:
我需要制服,正常,毒药和瑞利.
我试图从文档页面https://en.cppreference.com/w/cpp/thread/call_once运行示例,但它没有按预期工作。它会无限卡住。我想知道为什么会发生这种情况,或者它是否只是与某些特定编译器版本相关的错误。这是我用来运行程序https://repl.it/repls/UtterJubilantArchitects
#include <iostream>
#include <thread>
#include <mutex>
std::once_flag flag1, flag2;
void simple_do_once()
{
std::call_once(flag1, [](){ std::cout << "Simple example: called once\n"; });
}
void may_throw_function(bool do_throw)
{
if (do_throw) {
std::cout << "throw: call_once will retry\n"; // this may appear more than once
throw std::exception();
}
std::cout << "Didn't throw, call_once will not attempt again\n"; // guaranteed once
}
void do_once(bool do_throw)
{
try {
std::call_once(flag2, may_throw_function, do_throw);
}
catch (...) {
}
}
int main()
{ …Run Code Online (Sandbox Code Playgroud) 在C库中math.h,有一个sincos非常有效的函数,因为它在更接近单个调用sin()或者cos()调用两者的总时间的时间内计算正弦和余弦.
C++标准库中有这样的功能吗?
在29.5原型类型的C++标准2014年11月的工作草案中,它指出:
- 有一个泛型类模板atomic.模板参数T的类型应该是可以轻易复制的(3.9).[注意:不能静态初始化的类型参数可能难以使用. - 尾注]
所以 - 据我所知 - 这:
#include <atomic>
struct Message {
unsigned long int a;
unsigned long int b;
};
std::atomic<Message> sharedState;
int main() {
Message tmp{1,2};
sharedState.store(tmp);
Message tmp2=sharedState.load();
}
Run Code Online (Sandbox Code Playgroud)
应该是完全有效的标准c ++ 14(以及c ++ 11)代码.但是,如果我没有libatomic手动链接,那么命令
g++ -std=c++14 <filename>
Run Code Online (Sandbox Code Playgroud)
给出 - 至少在Fedora 22(gcc 5.1)上 - 以下链接错误:
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::store(Message, std::memory_order)':
main.cpp:(.text._ZNSt6atomicI7MessageE5storeES0_St12memory_order[_ZNSt6atomicI7MessageE5storeES0_St12memory_order]+0x3f): undefined reference to `__atomic_store_16'
/tmp/ccdiWWQi.o: In function `std::atomic<Message>::load(std::memory_order) const':
main.cpp:(.text._ZNKSt6atomicI7MessageE4loadESt12memory_order[_ZNKSt6atomicI7MessageE4loadESt12memory_order]+0x1c): undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 exit status …Run Code Online (Sandbox Code Playgroud) 例如,
#include <random>
struct stru {
//inline static std::mt19937 rnd; Oops!
inline static std::mt19937 rnd{};
};
int main() {
}
Run Code Online (Sandbox Code Playgroud)
我发现两者没有语义差异,而clang在编译两者时没有问题.然而,gcc 8.1为第一个产生以下错误:
prog.cc:4:30: error: no matching function for call to 'std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>::mersenne_twister_engine()'
inline static std::mt19937 rnd;
^~~
In file included from /opt/wandbox/gcc-8.1.0/include/c++/8.1.0/random:49,
from prog.cc:1:
/opt/wandbox/gcc-8.1.0/include/c++/8.1.0/bits/random.h:437:11: note: candidate: 'constexpr std::mersenne_twister_engine<long unsigned int, 32, 624, 397, 31, 2567483615, 11, 4294967295, 7, 2636928640, 15, 4022730752, 18, 1812433253>::mersenne_twister_engine(const …Run Code Online (Sandbox Code Playgroud)