gpt4 book ai didi

c++ - 通过第一个元素推断初始值设定项列表的类型

转载 作者:行者123 更新时间:2023-12-02 10:08:10 25 4
gpt4 key购买 nike

根据标准,以下代码是否正确(请注意,列表中第一个元素推导的类型应用于第二个列表初始化元素)?

#include <type_traits>
#include <initializer_list>

struct A {};

int main()
{
auto l = {A{}, {}};
static_assert(std::is_same_v<std::initializer_list<A>, decltype(l)>, "!");
}

最近,我想利用std::initializer_list作为 Vulkan 结构的连续存储:

auto dependencies = {
vk::SubpassDependency{
VK_SUBPASS_EXTERNAL,
0,
vk::PipelineStageFlagBits::eBottomOfPipe,
vk::PipelineStageFlagBits::eColorAttachmentOutput,
vk::AccessFlagBits::eMemoryRead,
vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite,
vk::DependencyFlagBits::eByRegion
},
{
0,
VK_SUBPASS_EXTERNAL,
vk::PipelineStageFlagBits::eColorAttachmentOutput,
vk::PipelineStageFlagBits::eBottomOfPipe,
vk::AccessFlagBits::eColorAttachmentRead | vk::AccessFlagBits::eColorAttachmentWrite,
vk::AccessFlagBits::eMemoryRead,
vk::DependencyFlagBits::eByRegion
}
};

并且发现上面的语法是有效的。语法比 std::initializer_list<vk::SubpassDependency> 更简洁。而不是auto ,但编译器是 GCC ( set(CMAKE_CXX_STANDARD 20) ),我不知道它是 GCC 特定的扩展/监督还是标准核心语言功能。

以前我认为我必须在列表初始化期间以显式方式指定所有元素的类型才能获得 std::initializer_list 的有效初始值设定项通过auto x = {<list>};语法。

最佳答案

这是我阅读的标准。这里的关键在于推演过程

[temp.deduct.call]

1 If removing references and cv-qualifiers from P gives std​::​initializer_­list<P'> or P'[N] for some P' and N and the argument is a non-empty initializer list ([dcl.init.list]), then deduction is performed instead for each element of the initializer list, taking P' as a function template parameter type and the initializer element as its argument,

初始化列表中的每个元素都被作为参数来推断元素类型。对于第一个,推导成功。而其他的都是非推导的上下文

[temp.deduct.type]

5 The non-deduced contexts are:

  • A function parameter for which the associated argument is an initializer list ([dcl.init.list]) but the parameter does not have a type for which deduction from an initializer list is specified ([temp.deduct.call]). [ Example:

    template<class T> void g(T);
    g({1,2,3}); // error: no argument deduced for T

     — end example ]

为了使模板参数推导成功,模板参数必须在从不同参数的推导中达成一致,只要可以从参数进行推导即可。如果达成共识(即使只有一个),推演就会成功。

[temp.deduct.type]

2 In some cases, the deduction is done using a single set of types P and A, in other cases, there will be a set of corresponding types P and A. Type deduction is done independently for each P/A pair, and the deduced template argument values are then combined. If type deduction cannot be done for any P/A pair, or if for any pair the deduction leads to more than one possible set of deduced values, or if different pairs yield different deduced values, or if any template argument remains neither deduced nor explicitly specified, template argument deduction fails. The type of a type parameter is only deduced from an array bound if it is not otherwise deduced.

由于是非推导上下文,尾随元素不能与第一个元素的推导不一致。所以模板参数推导应该是成功的。然后,在正确推导类型后,可以对 std::initializer_list 的每个元素进行初始化。来自其相应的初始值设定项。

关于c++ - 通过第一个元素推断初始值设定项列表的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59455963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com