为什么C++的 noexcept() 对constexpr函数返回false?
此问题在此处已有解答:
(共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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。