AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

    • 主页
    • 系统&网络
    • Ubuntu
    • Unix
    • DBA
    • Computer
    • Coding
    • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / coding / 问题

全部问题(coding)

Martin Hope
Fantastic Mr Fox
Asked: 2025-04-23 06:40:49 +0800 CST

msvc std::vector 实现中仅不接受可复制类型

  • 21

在下面的代码中:

struct copy_only
{
    copy_only() = default;
    copy_only(const copy_only&)            = default;
    copy_only& operator=(const copy_only&) = default;
    copy_only(copy_only&&)                 = delete;
    copy_only& operator=(copy_only&&)      = delete;
    ~copy_only()                           = default;
};


std::vector<copy_only> v;
copy_only c{};
v.push_back(c);

在 MSVC 上我们得到错误:

错误 C2280:'copy_only::copy_only(copy_only &&)':尝试引用已删除的函数

这来自于向量实现中push_back(const&)调用的emplace_back实现:

注意:编译类模板成员函数'void std::vector<copy_only,std::allocator<copy_only>>::push_back(const _Ty &)'

注意:请参阅正在编译的函数模板实例化“_Ty &std::vector<_Ty,std::allocator<_Ty>>::_Emplace_one_at_back<const _Ty&>(const _Ty &)”的引用

这可以用 gcc 和 clang 编译。这仅仅是 MSVC 编译器在最简单的向量示例上出现的严重 bug 吗?还是说存在一些标准问题,导致 gcc 和 clang 只是敷衍了事,阻止了这种用法?

实例。

c++
  • 3 个回答
  • 461 Views
Martin Hope
Howard Hinnant
Asked: 2025-04-21 08:30:25 +0800 CST

使用 chrono 查找下一个工作日

  • 22

给定年份、月份和日期,如何找到该日期或之后的下一个工作日?例如,如果我有 2025-04-28,如何找到 2025-04-28 之后的星期五,即 2025-05-02?

那么如何查找前一个工作日而不是下一个工作日呢?

我可以从价值观开始int,将它们放入,chrono然后int 再取回价值观吗?

如果输入日期已经在目标星期几,那么在获取输入日期和获取输入日期的一周之间需要进行什么更改?

c++
  • 1 个回答
  • 893 Views
Martin Hope
Fedor
Asked: 2025-04-15 01:01:44 +0800 CST

构造函数的成员初始化程序可以包含另一个成员的初始化吗?

  • 21

写这样的内容合法吗?

#include <memory>

struct A {
    int i, j;
    constexpr A() : i((std::construct_at(&j, 2), j-1)) {}
};
constexpr A a{};
static_assert(a.i == 1);
static_assert(a.j == 2);

这里,i-member 初始化器首先j使用 初始化成员std::construct_at,然后在 中读取其值j-1。

实践中我发现 GCC、MSVC 和 Clang 都能接受这个程序。在线演示:https://gcc.godbolt.org/z/YzEoPPj96

但 Clang 发出警告:

<source>:5:50: warning: field 'j' is uninitialized when used here [-Wuninitialized]
    5 |     constexpr A() : i((std::construct_at(&j, 2), j-1)) {}
      |                                                  ^

这看起来自相矛盾,因为读取常量表达式中未初始化的值必然会导致硬失败。程序是否格式正确,只是诊断错误?


感谢@TedLyngmo,这里有一个更复杂的堆分配示例:

#include <string>

struct A {
    std::string i, j;

    constexpr A()
        : i(((void)std::construct_at(&j,
                                     "Hello world, this is very funny indeed "
                                     "and this is a long string"),
             j + " with some exta in it"))
        , j([k=std::move(j)]()mutable { return std::move(k); }()) {}
};

static_assert( A{}.i.length() == 85 );
static_assert( A{}.j.length() == 64 );

在线演示:https://gcc.godbolt.org/z/zcb4hbhY3

c++
  • 1 个回答
  • 582 Views
Martin Hope
Petr Filipský
Asked: 2025-03-23 21:39:40 +0800 CST

为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

  • 22

在定义泛型 fallback 时,我遇到了传统SFINAE(使用type_traits和std::void_t)与现代C++20 概念operator<<之间的意外行为差异。目的很简单:创建一个泛型,仅当通过参数相关查找 (ADL)operator<<未找到任何现有自定义定义时才启用。operator<<

使用特征( )的传统基于SFINAEis_std_streamable的检测工作符合预期,其定义为:

template <class T, class = void>
struct is_std_streamable : std::false_type {};

template <class T>
struct is_std_streamable<T, std::void_t<decltype(std::declval<std::ostream&>() << std::declval<const T&>())>> : std::true_type {};

基于概念的检测(StdStreamable)定义为:

template <class T>
concept StdStreamable = requires(const T t, std::ostream& os) {
    { os << t } -> std::same_as<std::ostream&>;
};

通用的后备operator<<看起来像这样(requires注释掉的子句):

template <StdPrintable T>
// requires(!StdStreamable<T>)
// requires(!is_std_streamable<T>::value)
std::enable_if_t<!is_std_streamable<T>::value, std::ostream&>
operator<<(std::ostream& os, T const& val) {
...
}

取消注释基于概念requires的子句(requires(!StdStreamable<T>)或)时requires(!is_std_streamable<T>::value),GCC和Clang都会产生以下循环约束错误:

error: satisfaction of constraint 'StdStreamable<T>' depends on itself

我理解,在定义新版本的子句std::declval<std::ostream&>() << std::declval<const T&>()中使用表达式可能会被编译器解释为循环依赖。但为什么C++20 概念会触发此循环约束问题,而传统的SFINAE不会?这种行为是标准规定的,还是概念的已知限制,或者可能是编译器错误?requiresoperator<<

完整、最小、可重现的示例和其他详细信息:

  • https://godbolt.org/z/be7Yqxo93

提前致谢。

c++
  • 2 个回答
  • 1589 Views
Martin Hope
Catskul
Asked: 2025-03-04 06:57:53 +0800 CST

C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”?

  • 22

语境:

在 C++ 中,可以创建对“未知边界数组”的引用。

例子:const char (&)[]

在 C++20 之前,clang(14.x、18.x)不允许您将对已知边界的数组的引用强制转换为对未知边界的数组的引用,并且会失败并出现错误:

对不完整类型“const char[]”的引用无法绑定到类型“const char[5]”的左值

对于 C++20,clang 现在允许这样做。

另一方面,gcc 一直允许这样做,一直追溯到 C++98。

问题:

  • 这仅仅是标准上的分歧吗?
  • 其中一个人是不是搞错了?
  • C++20 是否改变或澄清了标准以使其更加明确有效?

例子

https://godbolt.org/z/66sh8a5z1

int main() {
    using StringLitRef = const char (&)[];
    StringLitRef array = "derp"; // works on g++ for any standard and clang with c++20
    return 0;
}
c++
  • 1 个回答
  • 1108 Views
Martin Hope
Stefan Pochmann
Asked: 2025-01-13 23:24:07 +0800 CST

为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同?

  • 21

集合是无序的,或者说它们的顺序是一个实现细节。我对这个细节很感兴趣。我看到了一个让我惊讶的案例:

print({2, 3, 10})
x = 2
print({x, 3, 10})

输出(在线尝试!):

{3, 10, 2}
{10, 2, 3}

尽管相同的元素以相同的顺序写入,但它们的排序却不同。这是怎么发生的?这是故意为之吗?例如,为了优化查找速度?

我的sys.version和sys.implementation:

3.13.0 (main, Nov  9 2024, 10:04:25) [GCC 14.2.1 20240910]
namespace(name='cpython', cache_tag='cpython-313', version=sys.version_info(major=3, minor=13, micro=0, releaselevel='final', serial=0), hexversion=51183856, _multiarch='x86_64-linux-gnu')
python
  • 1 个回答
  • 780 Views
Martin Hope
Chad Feller
Asked: 2024-10-21 05:50:33 +0800 CST

在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗?

  • 26

以下 bash 脚本:

#!/bin/bash

TEST_VAR=""

if [[ -z $TEST_VAR ]] then
    echo "empty"
else
    echo "$TEST_VAR"
fi

尽管“then”之前缺少一个分号,但在 bash 5.2 中不会引发错误并成功完成,甚至返回0。

在运行 bash 5.1 或 5.0 的系统上运行上述脚本会按预期失败。

这是为什么?bash 在 5.2 版中更改了解析器吗?搜索后,我找不到任何关于此更改的参考资料。bash 是否故意在此处更改了行为,或者这是一个错误?

bash
  • 1 个回答
  • 736 Views
Martin Hope
Wrench
Asked: 2024-05-05 13:37:20 +0800 CST

为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true?

  • 27

作为计算机安全入门课程的一部分,我们有一个关于 SQL 注入的简短单元。其中一项作业是一个基本的未经清理的登录页面。预期的解决方案是沿着经典路线的' or 1=1; -- ,但我们始终欢迎学生找到非传统的解决方案。

最近向我提出了这样的解决方案:输入'--'密码似乎执行了成功的 SQL 注入。这将导致查询被评估为如下所示:
SELECT * FROM users WHERE name='admin' AND password=''--'';

这里,--'';不被解析为注释,因为 MariaDB 要求注释后面跟空格。事实上,如果双破折号被解析为注释,则该查询根本不会返回任何内容;password=''同样地,假设密码非空,我们将得到,其计算结果为 false。

末尾的额外一对引号似乎是必要的:将其保留为password=''--;或在其后面插入其他数据 ( password=''--1;) 会导致条件被评估为 false,如预期的那样。

一些快速测试无法在其他数据库中重现这种行为——据我所知,这是 MariaDB 特有的行为。该文档确认两个不带空格的破折号不会被解析为注释,但没有详细说明它们被解析为什么。编辑:不知何故,我设法忽略了 MySQL 中也发生这种情况的事实。事实上,这种行为发生在任何 MySQL 分支(不仅仅是 MariaDB)中。

--当它后面没有空格时会发生什么?为什么它会导致比较结果为 true?

一个玩具示例:

CREATE TABLE users (
  userid INTEGER PRIMARY KEY,
  username TEXT NOT NULL,
  password TEXT NOT NULL
);

INSERT INTO users VALUES (0001, 'admin', 'S3cur3P4ssw0rd!');
INSERT INTO users VALUES (0002, 'generic_user', 'Password');

SELECT * FROM users WHERE username='admin' AND password=''; -- empty password, query returns no users
SELECT * FROM users WHERE username='admin' AND password=''-- ''; -- parsed as comment, equivalent to above query, returns no users
SELECT * FROM users WHERE username='admin' AND password=''--''; -- query returns admin user
SELECT * FROM users WHERE username='admin' AND password=''--; -- query returns zero users
SELECT * FROM users WHERE username='admin' AND password=''--1; -- query returns zero users
mysql
  • 1 个回答
  • 697 Views
Martin Hope
Waket Zheng
Asked: 2024-05-04 14:19:19 +0800 CST

为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError?

  • 29

通常,如果您尝试为同一关键字参数传递多个值,您会收到 TypeError:

In [1]: dict(id=1, **{'id': 2})
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Input In [1], in <cell line: 1>()
----> 1 dict(id=1, **{'id': 2})

TypeError: dict() got multiple values for keyword argument 'id'

但是,如果您在处理另一个异常时执行此操作,则会收到 KeyError:

In [2]: try:
   ...:     raise ValueError('foo') # no matter what kind of exception
   ...: except:
   ...:     dict(id=1, **{'id': 2}) # raises: KeyError: 'id'
   ...: 
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [2], in <cell line: 1>()
      1 try:
----> 2     raise ValueError('foo') # no matter what kind of exception
      3 except:

ValueError: foo

During handling of the above exception, another exception occurred:

KeyError                                  Traceback (most recent call last)
Input In [2], in <cell line: 1>()
      2     raise ValueError('foo') # no matter what kind of exception
      3 except:
----> 4     dict(id=1, **{'id': 2})

KeyError: 'id'

这里发生了什么?一个完全不相关的异常如何影响dict(id=1, **{'id': 2})抛出什么样的异常?

对于上下文,我在调查以下错误报告时发现了此行为:https://github.com/tortoise/tortoise-orm/issues/1583

这已在 CPython 3.11.8、3.10.5 和 3.9.5 上重现。

python
  • 1 个回答
  • 376 Views
Martin Hope
user924
Asked: 2024-03-20 03:12:31 +0800 CST

AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

  • 44

请投票给问题跟踪器 https://issuetracker.google.com/issues/330368298

在此输入图像描述

我刚刚通过查看 Firebase Crashlytics 注意到我的应用程序发生了一些崩溃,这似乎与尝试使用SharedPreferences但由于强制转换异常而无法获得首选项的 Google AdMob 库相关:

在此输入图像描述

在此输入图像描述

代码文字:

Fatal Exception: java.lang.ClassCastException
java.lang.Integer cannot be cast to java.lang.String
android.app.SharedPreferencesImpl.getString (SharedPreferencesImpl.java:302)
com.google.android.gms.ads.internal.scionintegration.a.onSharedPreferenceChanged (:com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:73)
com.google.android.gms.ads.internal.scionintegration.m.a (:com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:106)
com.google.android.gms.ads.nonagon.a.s (:com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:439)
com.google.android.gms.ads.nonagon.a.b (:com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:5)
com.google.android.gms.ads.ChimeraMobileAdsSettingManagerCreatorImpl.getMobileAdsSettingManager (:com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:52)
com.google.android.gms.ads.internal.client.bx.bR (:com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:40)
m.ajn.onTransact (:com.google.android.gms.policy_ads_fdr_dynamite@[email protected]:21)
android.os.Binder.transact (Binder.java:1173)
obj.gL (:com.google.android.gms@[email protected] (190400-607434947):8)
com.google.android.gms.ads.internal.client.ay.getMobileAdsSettingManager (:com.google.android.gms@[email protected] (190400-607434947):12)
com.google.android.gms.ads.MobileAdsSettingManagerCreatorImpl.getMobileAdsSettingManager (:com.google.android.gms@[email protected] (190400-607434947):42)
com.google.android.gms.ads.internal.client.az.fL (:com.google.android.gms@[email protected] (190400-607434947):40)
obk.onTransact (:com.google.android.gms@[email protected] (190400-607434947):101)
android.os.Binder.transact (Binder.java:1173)
com.google.android.gms.internal.ads.zzavg.zzbh (com.google.android.gms:play-services-ads-base@@22.6.0:1)
com.google.android.gms.ads.internal.client.zzcp.zze (zzcp.java:169)
com.google.android.gms.ads.internal.client.zzeq.zza (zzeq.java:169)
com.google.android.gms.ads.internal.client.zzaq.zzc (com.google.android.gms:play-services-ads-lite@@22.6.0:169)
com.google.android.gms.ads.internal.client.zzax.zzf (com.google.android.gms:play-services-ads-lite@@22.6.0:126)
com.google.android.gms.ads.internal.client.zzax.zzd (com.google.android.gms:play-services-ads-lite@@22.6.0:126)
com.google.android.gms.ads.internal.client.zzej.zzA (com.google.android.gms:play-services-ads-lite@@22.6.0:17)
com.google.android.gms.ads.internal.client.zzej.zzm (zzej.java:53)
com.google.android.gms.ads.MobileAds.initialize (com.google.android.gms:play-services-ads-lite@@22.6.0:53)
com.MY_APP_PACKAGE.ads.AdMob.initAdmob (AdMob.kt:128)

有人有这个问题吗?

我还有其他使用 22.6.0 版本 Admob 的应用程序,我没有注意到它们发生此类崩溃,而对于这个应用程序,它只发生在 6 个用户(约 23 万用户)中,但仍然......为什么会发生这种情况......

更新:

发现其他人也出现同样的问题:https ://groups.google.com/g/google-admob-ads-sdk/c/88UHAaWElsc

更新2:

现在我遇到了更多崩溃,现在它影响了其他应用程序

ps 另外,Admob Dashboard API 今天也关闭了,所以 mb 这是相关的

Reddit 主题

谷歌问题追踪器

临时解决方案:如果您为应用程序设置了 Firebase Remote Config 以禁用广告,MobileAds.initialize()如果您添加了特定参数,这也会阻止调用。不幸的是,就我而言,我只有参数来启用/禁用应用程序屏幕上的广告类型(横幅、插页式广告),但没有参数来阻止加载同意信息(UMP 库)和MobileAds.initialize(),但我现在会添加它以供将来使用案例...

  • 1 个回答
  • 1425 Views
下一页

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    重新格式化数字,在固定位置插入分隔符

    • 6 个回答
  • Marko Smith

    为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会?

    • 2 个回答
  • Marko Smith

    VScode 自动卸载扩展的问题(Material 主题)

    • 2 个回答
  • Marko Smith

    Vue 3:创建时出错“预期标识符但发现‘导入’”[重复]

    • 1 个回答
  • Marko Smith

    具有指定基础类型但没有枚举器的“枚举类”的用途是什么?

    • 1 个回答
  • Marko Smith

    如何修复未手动导入的模块的 MODULE_NOT_FOUND 错误?

    • 6 个回答
  • Marko Smith

    `(表达式,左值) = 右值` 在 C 或 C++ 中是有效的赋值吗?为什么有些编译器会接受/拒绝它?

    • 3 个回答
  • Marko Smith

    在 C++ 中,一个不执行任何操作的空程序需要 204KB 的堆,但在 C 中则不需要

    • 1 个回答
  • Marko Smith

    PowerBI 目前与 BigQuery 不兼容:Simba 驱动程序与 Windows 更新有关

    • 2 个回答
  • Marko Smith

    AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String”

    • 1 个回答
  • Martin Hope
    Fantastic Mr Fox msvc std::vector 实现中仅不接受可复制类型 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant 使用 chrono 查找下一个工作日 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor 构造函数的成员初始化程序可以包含另一个成员的初始化吗? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský 为什么 C++20 概念会导致循环约束错误,而老式的 SFINAE 不会? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul C++20 是否进行了更改,允许从已知绑定数组“type(&)[N]”转换为未知绑定数组“type(&)[]”? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann 为什么 {2,3,10} 和 {x,3,10} (x=2) 的顺序不同? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller 在 5.2 版中,bash 条件语句中的 [[ .. ]] 中的分号现在是可选的吗? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench 为什么双破折号 (--) 会导致此 MariaDB 子句评估为 true? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng 为什么 `dict(id=1, **{'id': 2})` 有时会引发 `KeyError: 'id'` 而不是 TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob:MobileAds.initialize() - 对于某些设备,“java.lang.Integer 无法转换为 java.lang.String” 2024-03-20 03:12:31 +0800 CST

热门标签

python javascript c++ c# java typescript sql reactjs html

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助
subwaysurfers
my femboy roommate

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve