使用常量表达式作为使用函数参数的模板参数:哪个编译器是正确的?

问题描述 投票:0回答:1

我有这段代码:

template <int V>
struct Constant {
    constexpr operator int() const noexcept { return V; }
};


template <class T, int N>
struct Array { };

auto function(auto s) -> Array<int, s + s> {
    return {};
}

auto const a = function(Constant<3>{});

令我最悲伤的是,似乎只有 Clang 接受这个代码。

哪个编译器是正确的,为什么?

c++ templates language-lawyer c++20 constexpr
1个回答
0
投票

我相信 clang 在这里是正确的。

请注意,gcc 和 MSVC 都接受等效的公式:

auto function(auto s) {
    return Array<int, s+s>{};
}

只是他们不允许在返回类型中使用参数。

但是,就像在函数体中将

s+s
写为常量表达式一样,不会违反 [expr.const] 的任何规则,尾随返回类型中也不会违反任何规则。我们同样没有阅读任何内容,因为
int
的转换函数是
constexpr
并且不依赖于任何数据。

© www.soinside.com 2019 - 2024. All rights reserved.