问题标签 [std-source-location]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 如何实现 std::experimental::source_location ?
C++ Extensions for Library Fundamentals,第 2 版( N4564 ) 引入了 type std::experimental::source_location
。
§ 14.1.2 [reflection.src_loc.creation] 说:
返回:当被后缀表达式是(可能带括号的)id 表达式命名的函数调用(C++14 § 5.2.2)调用时
current
,返回source_location
具有实现定义值的 a。该值应受(C++14 § 16.4) 以与 for和#line
相同的方式影响。如果以其他方式调用,则返回的值是未指定的。__LINE__
__FILE__
备注:当使用大括号或等号初始化器初始化非静态数据成员时,任何对 的调用
current
都应对应于初始化该成员的构造函数或聚合初始化的位置。[注意:当用作默认参数时(C++14 § 8.3.6), 的值
source_location
将是current
调用站点的调用位置。——尾注]
如果我理解正确,那么该功能旨在像这样使用。
预期输出:
如果没有std::experimental::source_location
,我们可能使用了一个辅助宏THROW_WITH_SOURCE_LOCATION
,它在内部使用__FILE__
和__LINE__
宏来正确初始化异常对象。
我想知道图书馆如何实现std::experimental::source_location
. 除非我完全忽略了这一点,否则如果没有特殊的编译器支持,这样做是不可能的。但是需要什么样的魔法编译器功能才能使这项工作?它可以与部署的技巧相媲美std::initializer_list
吗?是否有此功能的实验性实现可供查看?我已经检查了 GCC 的 SVN 源代码,但还没有找到任何东西。
c++ - 视觉工作室中的 std::experimental::source_location 实现
std::experimental::source_location
可以在 gcc 中使用__builtin_FILE()
、等实现合理一致的版本。Visual __builtin_LINE()
Studio 2017 中是否存在类似的内在函数?或者有什么方法可以std::experimental::source_location
在 Visual Studio 2017 中实现?
c++ - 编译时的 std::experimental::source_location
std::experimental::source_location
可能会在某个时候添加到 C++ 标准中。我想知道是否可以将位置信息放入编译时领域。本质上,我想要一个从不同源位置调用时返回不同类型的函数。像这样的东西,虽然它没有编译,因为location
对象不是constexpr
函数参数:
这不会编译,并带有关于的消息
关于return std::integral_constant<int, location.line()>{}
线。如果我不能使用它们,那么拥有这些方法source_location
有什么好处?constexpr
c++ - 是否可以在调用站点扩展默认参数的宏?
本__LINE__
例中的宏扩展为 3,因此 print 函数以相同的值被调用了 4 次。有没有办法说服编译器在调用点扩展这个宏,以便调用 print 函数6,7,8,9
而不是3,3,3,3
C++11 中存在的功能?
我的用例:
在我的应用程序中,我提供了多个采用唯一 ID 的函数。每个调用点/位置的 ID 应该是唯一的(因此,如果通过同一语句调用该函数两次,它应该接收相同的 ID)。目前,用户总是必须LOCATION
在调用点手动键入宏,如下所示:
如果我可以保存它们的输入,而不为每个函数创建一个宏,这样会更方便:
因此,我认为默认参数可以解决问题。有什么办法可以做到这一点?
c++ - 如何在可变参数模板函数中使用 source_location?
C++20 特性std::source_location
用于捕获有关调用函数的上下文的信息。当我尝试将它与可变参数模板函数一起使用时,我遇到了一个问题:我看不到放置source_location
参数的地方。
以下不起作用,因为可变参数必须在末尾:
以下内容也不起作用,因为调用者将被插入其中的参数搞砸:
我在与可变参数模板无缝协作的评论中获悉std::source_location
,但我很难弄清楚如何。如何使用std::source_location
可变参数模板函数?
c++ - C++20 是否要求将源代码存储在文件中?
但是,如果我没记错的话,这是一个有点奇怪的问题,C++ 源代码不需要文件系统来存储其文件。
拥有一个通过相机扫描手写文件的编译器将是一个符合要求的实现。虽然实际上没有那么大的意义。
然而,C++20 现在添加了带有file_name
. 现在这是否意味着源代码应该始终存储在文件中?
c++ - 为什么 std::source_location 的吸气剂没有标记为 [[nodiscard]]?
根据: https ://en.cppreference.com/w/cpp/utility/source_location
吸气剂未标记为 [[nodiscard]]。
是否有一个原因?除了返回值之外,它们在调用时是否有影响?
c++ - consteval 包装器与 source_location
我在 C++20 模式下使用 GCC10 尝试了以下第一个变体:
我期望以下输出:
但我得到了:
然后我尝试了以下第二个变体:
我期望以下输出:
但我得到了:
为什么代码会这样?有没有办法让它在不使用预处理器宏的情况下按预期运行?
更新:使用 'constexpr' 或 'inline' 而不是 'consteval' 的第二个变体适用于最新的 GCC。所以剩下的问题是:为什么“consteval”不能正常工作?有人告诉我这不是一个标准问题,而是一个实施主题,所以我将把这个问题重新标记为 GCC。
c++ - source_location::current() 评估为默认的非类型模板参数
[support.srcloc]介绍source_location::current
:
对它的任何调用都
current
显示为默认参数 ([dcl.fct.default]) 或其子表达式,应对应于使用默认参数 ([expr.call]) 的函数的调用位置。
请注意,“默认参数([dcl.fct.default])”包括默认模板参数,但上面的引用只提到了“函数调用的位置”。source_location::current()
在默认模板参数的上下文中进行评估是否合法?
考虑这段代码(现场演示):
clang 编译失败,报错:
错误:抱歉,“位置”类型的非类型模板参数尚不支持
gcc 使它被编译但给出了奇怪的结果function_name()
并line()
指示不同的位置:
./example.cpp caller_1 30 0
./example.cpp caller_2 30 0
c++ - std::source_location 作为非类型模板参数
在我无限探索可用作非类型模板参数的限制时,我试图查看是否可以std::source_location
用作非类型模板参数。这失败了一个奇怪的消息,因为我认为 source_location 是一些神奇的结构......
非类型模板参数的类型“std::experimental::source_location”不是结构类型
它失败了,所以我尝试使用 .file_name 来解决这个问题,但这也失败了(godbolt)。
注意:候选模板被忽略:替换失败:模板参数中不允许指向字符串字面量子对象的指针
有没有办法在不使用宏的情况下完成这项工作?
需要明确的是,我问的是source_location
用作模板参数,而不是解决我的玩具示例,它只是为了演示潜在的用例。