在C++ 11中,你仍然需要使用std::localtime和std::gmtime作为间接来打印std::chrono::time_point.这些函数在C++ 11引入的多线程环境中使用是不安全的,因为它们返回一个指向内部静态结构的指针.这尤其令人讨厌,因为C++ 11引入了方便的功能std::put_time,由于同样的原因几乎无法使用.
为什么这么根本被打破或者我忽略了什么?
如果你通过编译来关闭异常-fno-exceptions所有被认为是noexcept的函数,例如by std::move_if_noexcept或者你是否仍然必须声明函数noexcept?
Consider the following code (Godbolt):
#include <tuple>
#include <type_traits> // std::false_type, std::true_type
template <typename t_tuple, auto t_size = std::tuple_size_v<t_tuple>>
struct test : std::false_type {};
template <typename t_tuple>
struct test<t_tuple, 0> : std::true_type {};
int main(int argc, char **argv)
{
static_assert(test<std::tuple<>>::value);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
Clang and some other compilers accept the code but in GCC and ICC the static assertion fails. Either changing the type of t_size from auto to std::size_t or casting the zero in the specialisation to …
可能在任何操作系统上都可以静态或动态地编译C++/C标准库.在Windows上我总是喜欢静态构建,因为它有助于避免在特定的Windows版本,版本和服务包等上安装或不安装不同版本库的"dll hell"问题.静态链接使软件更便携,更少依赖于什么最终用户使用他的操作系统(我甚至看到最终用户可以SHIFT+DEL在某些DLL上进行的示例system32,他无法解释原因,或者当用户声称我的应用程序包含病毒时,因为它试图从官方Microsoft网站下载动态链接的先决条件...)因此,在我的经验中,静态链接通常比动态链接更好.但是,我是Linux新手,所以有人可以分享他的经验吗?我的问题是:如果我们忽略动态的一个允许节省内存和硬盘空间以及我们计划使用自动安装程序(硬盘驱动器空间和内存)分发软件的事实,那么在Linux上提供什么样的链接(动态或静态)?现在已经足够便宜了,所以没有理由牺牲创建真正好的便携式安装程序所需的工作时间来赢得一些兆字节的RAM或硬盘空间.动态/静态链接是否存在特定于Linux的问题?
对于我想std::chrono::seconds用来表示超时值的嵌入式项目,特别是出于类型性的原因.这需要std::chrono::seconds从unsigned int类型快速构造,并且传递值必须非常快.是这样的吗?
在这一行:
auto a = "Hello World";
Run Code Online (Sandbox Code Playgroud)
什么是确切的类型a?我猜char[]或者const char* const我不确定.
考虑一个按值获取对象,对其执行一些操作并返回该对象的函数,例如:
std::string MyToUpper (std::string s)
{
std::transform(s.begin(), s.end(), s.begin(), std::toupper);
return s;
}
Run Code Online (Sandbox Code Playgroud)
现在你用一个临时函数调用这个函数:
std::string Myupperstring = MyToUpper("text");
Run Code Online (Sandbox Code Playgroud)
从概念上讲,不需要副本。在这种情况下,现代编译器是否能够消除所有副本?如果没有,是否只有移动?这个案子呢:
std::string Mylowerstring("text");
std::string Myupperstring = MyToUpper(std::move(Mylowerstring));
Run Code Online (Sandbox Code Playgroud) 如果函数返回如下值:
std::string foo() {
std::string ret {"Test"};
return ret;
}
Run Code Online (Sandbox Code Playgroud)
允许编译器移动ret,因为它不再使用.对于这样的情况,这不适用:
void foo (std::string str) {
// do sth. with str
}
int main() {
std::string a {"Test"};
foo(a);
}
Run Code Online (Sandbox Code Playgroud)
虽然a显然不再需要它,因为它在下一步中被破坏,你必须这样做:
int main() {
std::string a {"Test"};
foo(std::move(a));
}
Run Code Online (Sandbox Code Playgroud)
为什么?在我看来,这是不必要的复杂,因为rvalues和移动语义很难理解,特别是对于初学者.因此,如果你不必关心标准情况,但无论如何都要从移动语义中获益(比如返回值和临时值),这将是很棒的.同样令人烦恼的是必须查看类定义以发现一个类是否已启用移动并从中受益std::move(或者std::move无论如何都希望它有时会有用.如果你继续工作,它也很容易出错.现有代码:
int main() {
std::string a {"Test"};
foo(std::move(a));
// [...] 100 lines of code
// new line:
foo(a); // Ups!
}
Run Code Online (Sandbox Code Playgroud)
如果不再使用对象,编译器会更好地了解.std::move到处都是冗长的,降低了可读性.