问题标签 [constexpr]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - std::piecewise_construct 不会导致 ODR 违规吗?
std::piecewise_construct
,在 <utility> 中定义,自声明以来具有内部链接constexpr
。我想知道std::piecewise_construct
在标头中使用是否会违反 ODR。例如:
一个.hpp
翻译单元 1
翻译单元 2
TU 1 中的std::piecewise_construct
inf
指的是与f
TU 2 中不同的对象。我怀疑f
违反了 ODR。
N3290(也可能是 ISO/IEC 14882:2011)在 3.2/5 中表示以下情况是 ODR 的一个例外:
如果对象在 D 的所有定义中具有相同的文字类型,并且该对象使用常量表达式(5.19)初始化,并且值(但不是地址),则名称可以引用具有内部链接或没有链接的 const 对象该对象被使用,并且该对象在 D 的所有定义中具有相同的值;
f
满足几乎所有要求,但“使用对象的值(但不是地址)”对我来说似乎模棱两可。确实std::piecewise_construct_t
没有状态,但是调用 的分段构造函数std::pair
涉及调用 的隐式声明的复制构造函数std::piecewise_construct_t
,其参数是const std::piecewise_construct_t &
。地址被“使用”了,不是吗?
我很困惑。
参考: http: //lists.boost.org/Archives/boost/2007/06/123353.php
c++ - 静态 constexpr 方法实现导致 gcc 错误?
这是一段代码:
我基本上做的是static
constepxr
在类声明中声明一个方法,然后我实现它。
原始代码被拆分为两个文件,并包含更多已被剥离的方法/属性,只留下所需的代码。
当我编译代码时,我从 GCC 4.6.0 收到以下错误:
这真的是一个错误吗?
在这种情况下,我必须提供什么我的报告?
我在在线 C++0x 编译器上测试了代码并得到以下错误:
该编译器使用 GCC 4.5.1。它让我知道我的代码格式不正确,但引入了更多问题:
- 为什么 GCC 4.5.1 报错而 GCC 4.6.0 报错?
在写完最后一段之后,我在 GCC 4.6.0 上进行了测试,去掉了static
关键字,单独的实现在没有任何警告的情况下编译!
- 为什么同一家族的两个编译器的行为如此不同?
我知道constexpr
方法应该避免任何不同于 的语句return
,这可以解释 GCC 4.5.1 错误报告。由于我的方法使用宏条件来返回良好的(常量)值,因此需要几行来解释为什么我要使用分离的实现(除了通常的建议之外)。
我的配置:
c++ - 返回 constexpr 的函数无法编译
为什么不编译: a作为返回类型
会不会有问题?string
c++ - 对静态 constexpr char[] 的未定义引用
我想static const
char
在我的班上有一个数组。GCC 抱怨并告诉我应该使用constexpr
,尽管现在它告诉我这是一个未定义的引用。如果我使数组成为非成员,那么它会编译。到底是怎么回事?
c++ - 在同一类中使用 constexpr 作为模板参数时出错
如果我尝试编译以下 C++0x 代码,则会收到错误消息:
使用 gcc 4.6.1,错误消息是:
使用 clang 2.8,错误消息是:
如果我将constexpr
函数移动到基类,它可以在 gcc 上运行,并在 clang 上给出相同的错误消息:
代码是错误的,还是 gcc 4.6 的 C++0x 实现的限制或错误?如果代码错了,为什么错了,C++11标准的哪些条款说错了?
c++ - 用户定义的文字参数不是 constexpr?
我正在测试用户定义的文字。我想_fac
返回数字的阶乘。
让它调用一个constexpr
函数是可行的,但是它不允许我用模板来做,因为编译器抱怨参数 is not 和 cannot be constexpr
。
我对此感到困惑-文字不是常量表达式吗?5
in始终是一个可以在编译时评估的5_fac
文字,那么为什么我不能这样使用它呢?
第一种方法:
第二种方法:
c++ - 为什么 C++11 constexpr 如此严格?
您可能知道,C++11 引入了constexpr
关键字。
C++11 引入了关键字 constexpr,它允许用户保证函数或对象构造函数是编译时常量。[...] 这使编译器能够理解并验证 [函数名称] 是编译时常量。
我的问题是为什么对可以声明的函数的形式有如此严格的限制。我理解希望保证函数是纯的,但考虑一下:
在函数上使用 constexpr 对该函数的功能施加了一些限制。首先,函数必须具有非 void 返回类型。其次,函数体不能声明变量或定义新类型。第三,主体可能只包含声明、空语句和单个返回语句。必须存在参数值,以便在参数替换之后,return 语句中的表达式产生一个常量表达式。
这意味着这个纯函数是非法的:
你也不能定义局部变量...... :(所以我想知道这是一个设计决定,还是编译器在证明函数 a 是纯函数时会很糟糕?
c++ - 类静态 constexpr 的 C++ 链接器错误
我正在编译以下简单程序g++-4.6.1 --std=c++0x
:
我收到以下链接器错误:
我意识到内联定义的静态成员没有定义符号,但我的(可能有缺陷的)印象是 usingconstexpr
告诉编译器始终将符号视为表达式;因此,编译器会知道传递对符号的引用是不合法的S::X
(出于同样的原因,您不能引用字面量10
)。
但是,如果 S 被声明为命名空间,即“命名空间 S”而不是“结构 S”,则一切都可以正常链接。
这是一个g++
错误还是我仍然需要使用技巧来解决这个烦恼?
c++ - 在 C++11 中,sqrt 定义为 constexpr?
在 C++11 中被std::sqrt
定义为constexpr
,即它可以合法地从其他constexpr
函数或在编译时上下文(如数组大小或模板参数)中使用吗?g++ 似乎允许它(使用-std=c++0x
),但我不确定我是否可以将其视为权威,因为 c++0x/c++11 支持仍然不完整。我似乎无法在 Internet 上找到任何东西的事实让我不确定。
似乎这应该是使用 Google 可以轻松找到的东西,但我已经尝试过(现在已经 40 分钟......)并且找不到任何东西。我可以找到几个将 constexpr 添加到标准库的各个部分的建议(例如这个),但没有关于sqrt
其他数学函数的内容。
c++ - C ++ 11 - constexpr函数中的static_assert?
如何在函数static_assert
内正确执行 a constexpr
?例如:
这不是有效的 C++11 代码,因为 constexpr 函数必须只包含 return 语句。我不认为该标准对此有例外,尽管 GCC 4.7 不允许我编译此代码。