language-lawyer 相关问题

有关编程语言和环境的正式或权威规范的复杂性的问题。

回答 1 投票 0



以枚举器值转换为Integer

在以下简化程序中,我尝试根据枚举器值创建一个std ::向量对象: #include 枚举类E {count}; int main(){ std ::vector 在以下简化程序中,我尝试根据枚举器值创建一个大小的对象:std::vector 在海湾合作委员会中运行良好,但其他编译器抱怨。 clang: #include <vector> enum class E { Count }; int main() { std::vector<int*> vec( size_t( E::Count ) ); } MSVC: error: parameter declarator cannot be qualified 6 | std::vector<int*> vec( size_t( E::Count ) ); 在线演示:Https://gcc.godbolt.org/z/sp3mfpgb9 在这里实施的实现是正确的? 您正在遇到C ++中的“最烦人的解析”问题。 error C2751: 'E::Count': the name of a function parameter cannot be qualified C ++解析器将此行解释为函数声明,而不是对象的实例化。它被解析为名为std::vector<int*> vec( size_t( E::Count ) ); 返回vec的函数,并使用合格的名称std::vector<int*>typesize_t的一个未命名的参数是非法的,因为参数不能合格(此处不允许范围)。 特别是,括号是模棱两可的。在解析器上,这似乎您正在尝试声明一个名为E::Count返回(size_t(E::Count))的函数,并采用typevecand的参数。和合格的名称(具有范围分辨率的名称)不允许用于参数名称,因此错误。 根据C ++标准,要用包含单个参数的括号显式初始化对象,您必须通过添加额外的括号或牙套来避免歧义,以避免烦恼的解析场景。因此,MSVC和Clang正确地将您的代码标记为无效,而GCC则将其错误地接受。 有几种解决此问题的方法。 eption1,添加额外的括号:std::vector<int*>或牙套(首选)size_tGCC在接受原始片段时是不正确的。这是GCC错误(不符合标准的行为)。

回答 1 投票 0


置换新 + reinterpret_cast +指针算术= ub?

在这里与std :: aligned_storage页面相似的示例,想象我有以下内容: 模板 类slotarray { static_assert(!std ::is_array_v

回答 1 投票 0









char阵列作为编译时常数

如果我们有一个由字符串文字初始初始化的const char指针,例如const char *str =“ hi!”,那么我们不能将str用作编译时常数。这很有意义,str是可变的AF ...

回答 1 投票 0

在哪里定义,可以将参考转换为更为CV的标志参考?

C ++,我可以将CV-Qualifier添加到参考:

回答 1 投票 0

仅适用于MSVC

考虑以下代码: #include #include 构造mysqlstream { 模板 mysqlstream&operator<<( const std::vector&

回答 1 投票 0

ppsose i有一个包含一个数组的数组:

现在假设我有一系列这些对象:

回答 0 投票 0


我为“暗示”操作员制作了宏。它通常运行良好,但是在概念或需要判断中使用时会在叮当响。 run在gcc.godbolt.org

namespace detail { template <typename T> concept BoolLike = requires(T &&t) {(T &&)t ? true : false;}; struct Implies { template <BoolLike T> friend constexpr bool operator||(T &&lhs, Implies) { return !bool((T &&)lhs); } }; } #define IMPLIES ||::detail::Implies{}|| template <typename T> concept A = true IMPLIES true; static_assert(A<int>);

回答 1 投票 0

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.