为什么C++的 noexcept() 对constexpr函数返回false?

编程语言 2026-07-07

此问题在此处已有解答

noexcept 行为的 constexpr 函数

(共2 条答案)

已于17小时前关闭。

根据cppreference.com对 constexpr的条目(此处),如果函数是constexpr,noexcept() 将返回true。以下是相关示例:

constexpr int f() { return 0; }
constexpr bool b2 = noexcept(f()); // true, f() is a constant expression

此特性一直支持到C++17。我使用的是C++14,因为 __cplusplus的返回值是201402。因此,我应该能够支持此功能。于是,我写了以下代码:

constexpr int f() { return 0; }

int main() {
  constexpr bool b2 = noexcept(f());
  std::cout << b2 << "\n";

  return 0;
}

使用下面的Makefile:

INCLUDE_DIR = include
BUILD_DIR = build
CXX = g++
CXXFLAGS = -Wall -Wextra -I./include -O3 -march=native -flto
TARGET = outBin
OBJECTS = $(BUILD_DIR)/main.o

$(TARGET): $(OBJECTS)
    $(CXX) $^ -o $@

$(BUILD_DIR)/main.o: main.cc
    $(CXX) $(CXXFLAGS) -c $^ -o $@

clean:
    rm $(TARGET) $(BUILD_DIR)/*.o

.PHONY: clean

然而,这段代码返回的是false。请注意我写的代码与cppreference.com上的相同。为什么会这样?

解决方案

看起来在这个问题上,cppreference似乎有一个错误。一个表达式是否为常量表达式,与它是否被视为noexcept无关。将表达式的noexcept性质缓存以便在模板代码中根据不同实现进行选择,是很常见的做法。如果把它设为常量表达式会影响该结果,将会导致大量代码出错和/或无法正确实现。已经有一些独立的方法来检查代码是否在编译时进行求值,并且更新的C++标准支持在常量求值期间抛出和捕获异常。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章