小编Jer*_*emy的帖子

为什么GCC定义一元运算符'&&'而不是仅使用'&'?

正如在这个问题中所讨论的,GCC定义了非标准的一元运算符&&来获取标签的地址.

为什么它定义一个新的运算符,而不是使用运算符的现有语义&和/或函数的语义(where foo&fooboth都产生函数的地址foo())?

c gcc addressof unary-operator

24
推荐指数
2
解决办法
2509
查看次数

C++标准是否要求在主线程中执行静态变量的动态初始化?

C++标准是否要求动态初始化非本地静态变量,是否在调用的同一线程中执行main()

更具体地说,在C++ 11中,std::this_thread::get_id()保证在静态初始化器和内部返回相同的结果main()

编辑:

更具体地说,给出以下代码:

#include <iostream>
#include <thread>

static std::thread::id id = std::this_thread::get_id();

int main()
{
        std::cout << id << "\n";
        std::cout << std::this_thread::get_id() << "\n";
        return 0;
}
Run Code Online (Sandbox Code Playgroud)

两个发出的线程ID是否需要/保证匹配?

c++ language-lawyer c++11

16
推荐指数
2
解决办法
664
查看次数

初始化std :: array <>

请考虑以下代码:

#include <array>

struct A
{
    int a;
    int b;
};

static std::array<A, 4> x1 =
{
        { 1, 2 },
        { 3, 4 },
        { 5, 6 },
        { 7, 8 }
};

static std::array<A, 4> x2 =
{
    {
        { 1, 2 },
        { 3, 4 },
        { 5, 6 },
        { 7, 8 }
    }
};

static std::array<A, 4> x3 =
{
       A{ 1, 2 },
       A{ 3, 4 },
       A{ 5, 6 },
       A{ 7, 8 …
Run Code Online (Sandbox Code Playgroud)

c++ aggregate-initialization c++11 stdarray

15
推荐指数
1
解决办法
1692
查看次数

使用libclang获取原始(未扩展)宏文本

使用libclang,我有一个AST的游标,它对应于宏扩展产生的语句.我想检索原始的,未展开的宏文本.

我已经找了一个libclang API来做这个,但找不到一个.我错过了什么吗?

假设这样的API不存在,我会看到几种方法可以做到这一点,两者都基于使用clang_getCursorExtent()来获取光标的源范围 - 可能是原始文本的范围.

第一个想法是使用clang_getFileLocation()来获取范围开始和结束的文件名和位置,并直接从文件中读取文本.如果我是从未保存的文件编译的,那么我需要处理它,但我对这种方法的主要关注是,当我确定clang在内部保存所有这些信息时,出门到文件系统似乎是不对的. .如果AST已加载而不是生成,或者源文件自解析后已被修改,也会有影响.

第二种方法是在游标范围上调用clang_tokenize().我尝试这样做,发现它无法为AST中的大多数游标生成令牌列表.跟踪代码,结果是内部clang_tokenize()操纵提供的范围并最终得出结论它跨越多个文件(可能是由于宏扩展的某些影响),并且中止.这对我来说似乎不对,但我确实觉得无论如何我都在滥用clang_tokenize()试图这样做.

那么,最好的方法是什么?

clang libclang

13
推荐指数
1
解决办法
1801
查看次数

为什么boost :: filesystem :: canonical()要求目标路径存在?

boost::filesystem::canonical(const path& p)各州的文件:

概述:将必须存在的p转换为没有符号链接,点或点点元素的绝对路径.
...
备注:!exists(p)是一个错误.

其结果是,如果p标识其目标不存在的符号链接,则该函数将失败file not found并且不返回路径.

这对我来说似乎过于严格:仅仅因为链接的目标不存在,我认为没有理由为什么该函数无法解析该不存在的目标的路径.(相比之下,absolute()没有这样的限制.)

(显然,如果一个符号链接的路径被打破,目标路径不能被解决.)

那么,这种限制是否有正当理由?

即使存在,是否也没有理由创建没有此限制的函数变体?(如果没有这样的变体,获取路径需要容易出错的手动复制canonical()已经完成的99%.)

我理解在这种情况之间存在的语义细微之处stat()并且lstat()同样适用于这种情况 - 这正是我认为函数变体同样合理的原因.

注意:这个问题同样适用于基于的std::experimental::filesystem库(n4100)boost::filesystem.

编辑:

在@Jonathan Wakeley下面非常知识渊博的答案之后,我仍然留下了原始问题的精髓,我将稍微重新思考:

  • 是否有一个基本的技术或逻辑上的理由,为什么boost::filesystem::canonical()要求目标存在?我的意思是,目标的不存在是否会使得无法解决规范形式的道路?

  • 如果没有,是否有任何技术或逻辑上的理由提出,只有从现有的形式,不同之处在于它的功能的变化要求目标存在?

  • boost::filesystem提议的N4100 的转换中(据我理解的情况)std::experimental::filesystem,是否canonical()经过适当的考虑后采用了这种限制,还是仅仅从Boost定义中"落后"?

编辑2:

我注意到Boost 1.60现在提供了这样的功能weakly_canonical():"返回p,symlinks已解析,结果归一化.返回:一个路径,由在canonical()p的前导元素组成的路径上调用函数的结果组成,如果有,则按照由p的元素,如果有的话,不存在."

编辑3:

这更多的讨论有关std::filesystem.

c++ boost boost-filesystem c++17

13
推荐指数
2
解决办法
7418
查看次数

当`sleep_until()`指定过去的时间点时,行为是否定义良好?

C++ 11标准讨论了如果调整系统时钟以使传递到的时间点sleep_until()现在已经过去会发生什么 - 但是当指定的时间点已经存在时,我无法看到解决该问题的任何地方.过去.

我是否只是忽略了某些东西,或者它是否真的没有指定 - 即使是UB或实现定义的东西?

如果sleep_for()以负持续时间调用,则会出现类似的问题.

c++ language-lawyer c++11 c++-chrono stdthread

8
推荐指数
2
解决办法
648
查看次数

`std::chrono` 时钟中的签名和未签名的 `rep`

rep类型std::chrono::system_clock必须是有符号算术类型,而steady_clockhigh_resolution_clock(和自定义时钟类型)不需要有符号rep类型。

这种区别的基本原理是什么,使用无符号rep类型的时钟会产生什么后果?

c++ std c++-chrono

6
推荐指数
1
解决办法
346
查看次数