问题标签 [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.

0 投票
1 回答
5434 浏览

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 源代码,但还没有找到任何东西。

0 投票
1 回答
1937 浏览

c++ - 视觉工作室中的 std::experimental::source_location 实现

std::experimental::source_location可以在 gcc 中使用__builtin_FILE()、等实现合理一致的版本。Visual __builtin_LINE()Studio 2017 中是否存在类似的内在函数?或者有什么方法可以std::experimental::source_location在 Visual Studio 2017 中实现?

0 投票
1 回答
990 浏览

c++ - 编译时的 std::experimental::source_location

std::experimental::source_location可能会在某个时候添加到 C++ 标准中。我想知道是否可以将位置信息放入编译时领域。本质上,我想要一个从不同源位置调用时返回不同类型的函数。像这样的东西,虽然它没有编译,因为location对象不是constexpr函数参数:

这不会编译,并带有关于的消息

关于return std::integral_constant<int, location.line()>{}线。如果我不能使用它们,那么拥有这些方法source_location有什么好处?constexpr

0 投票
3 回答
132 浏览

c++ - 是否可以在调用站点扩展默认参数的宏?

__LINE__例中的宏扩展为 3,因此 print 函数以相同的值被调用了 4 次。有没有办法说服编译器在调用点扩展这个宏,以便调用 print 函数6,7,8,9而不是3,3,3,3C++11 中存在的功能?

我的用例:

在我的应用程序中,我提供了多个采用唯一 ID 的函数。每个调用点/位置的 ID 应该是唯一的(因此,如果通过同一语句调用该函数两次,它应该接收相同的 ID)。目前,用户总是必须LOCATION在调用点手动键入宏,如下所示:

如果我可以保存它们的输入,而不为每个函数创建一个宏,这样会更方便:

因此,我认为默认参数可以解决问题。有什么办法可以做到这一点?

0 投票
5 回答
3381 浏览

c++ - 如何在可变参数模板函数中使用 source_location?

C++20 特性std::source_location用于捕获有关调用函数的上下文的信息。当我尝试将它与可变参数模板函数一起使用时,我遇到了一个问题:我看不到放置source_location参数的地方。

以下不起作用,因为可变参数必须在末尾:

以下内容也不起作用,因为调用者将被插入其中的参数搞砸:

我在与可变参数模板无缝协作的评论中获悉std::source_location,但我很难弄清楚如何。如何使用std::source_location可变参数模板函数?

0 投票
2 回答
11485 浏览

c++ - C++20 是否要求将源代码存储在文件中?

但是,如果我没记错的话,这是一个有点奇怪的问题,C++ 源代码不需要文件系统来存储其文件。

拥有一个通过相机扫描手写文件的编译器将是一个符合要求的实现。虽然实际上没有那么大的意义。

然而,C++20 现在添加了带有file_name. 现在这是否意味着源代码应该始终存储在文件中?

0 投票
0 回答
33 浏览

c++ - 为什么 std::source_location 的吸气剂没有标记为 [[nodiscard]]?

根据: https ://en.cppreference.com/w/cpp/utility/source_location

吸气剂未标记为 [[nodiscard]]。

是否有一个原因?除了返回值之外,它们在调用时是否有影响?

0 投票
1 回答
191 浏览

c++ - consteval 包装器与 source_location

我在 C++20 模式下使用 GCC10 尝试了以下第一个变体:

我期望以下输出:

但我得到了:

然后我尝试了以下第二个变体:

我期望以下输出:

但我得到了:

为什么代码会这样?有没有办法让它在不使用预处理器宏的情况下按预期运行?

更新:使用 'constexpr' 或 'inline' 而不是 'consteval' 的第二个变体适用于最新的 GCC。所以剩下的问题是:为什么“consteval”不能正常工作?有人告诉我这不是一个标准问题,而是一个实施主题,所以我将把这个问题重新标记为 GCC。

0 投票
0 回答
205 浏览

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

0 投票
1 回答
302 浏览

c++ - std::source_location 作为非类型模板参数

在我无限探索可用作非类型模板参数的限制时,我试图查看是否可以std::source_location用作非类型模板参数。这失败了一个奇怪的消息,因为我认为 source_location 是一些神奇的结构......

非类型模板参数的类型“std::experimental::source_location”不是结构类型

它失败了,所以我尝试使用 .file_name 来解决这个问题,但这也失败了(godbolt)。

注意:候选模板被忽略:替换失败:模板参数中不允许指向字符串字面量子对象的指针

有没有办法在不使用宏的情况下完成这项工作?

需要明确的是,我问的是source_location用作模板参数,而不是解决我的玩具示例,它只是为了演示潜在的用例。