正如在这个问题中所讨论的,GCC定义了非标准的一元运算符&&来获取标签的地址.
为什么它定义一个新的运算符,而不是使用运算符的现有语义&和/或函数的语义(where foo和&fooboth都产生函数的地址foo())?
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是否需要/保证匹配?
请考虑以下代码:
#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) 使用libclang,我有一个AST的游标,它对应于宏扩展产生的语句.我想检索原始的,未展开的宏文本.
我已经找了一个libclang API来做这个,但找不到一个.我错过了什么吗?
假设这样的API不存在,我会看到几种方法可以做到这一点,两者都基于使用clang_getCursorExtent()来获取光标的源范围 - 可能是原始文本的范围.
第一个想法是使用clang_getFileLocation()来获取范围开始和结束的文件名和位置,并直接从文件中读取文本.如果我是从未保存的文件编译的,那么我需要处理它,但我对这种方法的主要关注是,当我确定clang在内部保存所有这些信息时,出门到文件系统似乎是不对的. .如果AST已加载而不是生成,或者源文件自解析后已被修改,也会有影响.
第二种方法是在游标范围上调用clang_tokenize().我尝试这样做,发现它无法为AST中的大多数游标生成令牌列表.跟踪代码,结果是内部clang_tokenize()操纵提供的范围并最终得出结论它跨越多个文件(可能是由于宏扩展的某些影响),并且中止.这对我来说似乎不对,但我确实觉得无论如何我都在滥用clang_tokenize()试图这样做.
那么,最好的方法是什么?
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++ 11标准讨论了如果调整系统时钟以使传递到的时间点sleep_until()现在已经过去会发生什么 - 但是当指定的时间点已经存在时,我无法看到解决该问题的任何地方.过去.
我是否只是忽略了某些东西,或者它是否真的没有指定 - 即使是UB或实现定义的东西?
如果sleep_for()以负持续时间调用,则会出现类似的问题.
的rep类型std::chrono::system_clock必须是有符号算术类型,而steady_clock和high_resolution_clock(和自定义时钟类型)不需要有符号rep类型。
这种区别的基本原理是什么,使用无符号rep类型的时钟会产生什么后果?