gpt4 book ai didi

c++ - "if constexpr"与 "try in constexpr function"警告交互

转载 作者:可可西里 更新时间:2023-11-01 18:26:10 36 4
gpt4 key购买 nike

我声称 this program应该是合式的:它声明了 S<int> 的 constexpr 成员函数.但是,GCC 和 Clang 都拒绝这个程序。

template<class T>
struct S {
constexpr int foo() {
if constexpr (std::is_same_v<T, int>) {
return 0;
} else {
try {} catch (...) {}
return 1;
}
}
};

int main()
{
S<int> s;
return s.foo(); // expect "return 0"
}

海湾合作委员会说:

error: 'try' in 'constexpr' function

clang 说:

error: statement not allowed in constexpr function

他们似乎都没有注意到“try”语句位于if constexpr 的废弃分支中。声明。

如果我考虑 try/catch out 进入一个非 constexpr 成员函数 void trycatch() , 然后 Clang 和 GCC 再次对代码感到满意,即使它的行为应该等同于不满意的版本。

template<class T>
struct S {
void trycatch() {
try {} catch (...) {}
}
constexpr int foo() {
if constexpr (std::is_same_v<T, int>) {
return 0;
} else {
trycatch(); // This is fine.
return 1;
}
}
};

这是吗

  • GCC 和 Clang 中的错误?
  • GCC 和 Clang 忠实执行的标准中的缺陷?
  • 由于 "conditional constexprness" 导致的实现质量问题的 foo()

(无关背景:我正在为 any::emplace<T>() 的分配器感知版本实现 constexpr any,其分配器可能是 constexpr-per- P0639(即它可能缺少 deallocate 成员函数)或者可能不是。在前一种情况下,我们不需要或不需要 try;在后一种情况下,我们需要 try,以便在 deallocate 的构造函数抛出时调用 T。)

最佳答案

编译器遵守标准。 C++17 草案 N4659 说 ([dcl.constexpr]/(3.4.4)):

The definition of a constexpr function shall satisfy the following requirements:

  • ...

  • its function-body shall be = delete, = default, or a compound-statement that does not contain

    • ...

    • a try-block, or

    • ...

并且没有关于“丢弃语句”的规则,例如 else在您的 S<int>::foo 中声明覆盖此规则。关于丢弃语句的唯一特殊说明是丢弃语句未实例化,丢弃语句中的 ODR 使用不会导致需要使用的声明的定义,并且丢弃 return在确定具有占位符返回类型的函数的真实返回类型时,语句将被忽略。

我没有看到任何现有的 C++ Issue 讨论这个问题,也没有看到提出 if constexpr 的论文 P0292R1不解决与 constexpr 函数的交互。

关于c++ - "if constexpr"与 "try in constexpr function"警告交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46780657/

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