AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / 问题

All perguntas(coding)

Martin Hope
HolyBlackCat
Asked: 2024-09-20 19:16:25 +0800 CST

Por que `operator==` do std::expected não é compatível com SFINAE?

  • 11

Estou lendo a documentação em std::expected::operator==, e aparentemente não é amigável ao SFINAE. Em vez de "não participa da resolução de sobrecarga se [os tipos não forem eq-comparáveis]", diz "o programa está malformado [nesse caso]".

E de fato:

#include <concepts>
#include <expected>

struct A {};

static_assert(!std::equality_comparable<std::expected<A, A>>);

Esta afirmação falha no MSVC e no Clang com libc++ e causa um erro grave no Clang com MSVC STL.

Mas por que não é compatível com SFINAE?

std::expected<T,U>requer que ambos Te Usejam completos de qualquer forma, então aparentemente nada impede que todas as operações nele sejam compatíveis com SFINAE.

c++
  • 1 respostas
  • 80 Views
Martin Hope
mysteriarcha
Asked: 2024-09-17 00:19:21 +0800 CST

Mudança aleatória na saída obj_addr() ao incluir os objetos em uma lista e vetorizá-los

  • 11

Há um comportamento estranho de lobstr::obj_addr causado por sua vetorização sobre listas, quando a própria lista não altera o endereço

Acabei de começar Advanced R de Wickham (2ª ed.) e cheguei ao primeiro exercício 2.2.2 Exercises. Eu supus que, dado:

a <- 1:10; b <- a; c <- b

todos eles teriam o mesmo endereço de memória recuperado pela lobstr::obj_addrfunção. Isso é verdade se usarmos apenas a, b ou c como entradas, mas como sou preguiçoso e queria ter todos os valores de uma vez, fiz:

list(a, b, c) |> lapply(obj_addr) # lapply or sapply 

Então obtemos um conjunto diferente de valores entre os diferentes nomes toda vez que a função é executada. Isso ainda acontece se definimos x <- list(a, b, c)antes de chamar a função por meio de lapply, e obj_addr(x[[1]]) == obj_addr(x[[2]]) == obj_addr(x[[3]]) == obj_addr(a), então não é uma questão de criar uma nova lista toda vez. Alguém sabe o que está acontecendo aqui? Eu entendo que até certo ponto cada chamada gera um novo objeto de saída que terá seu próprio endereço de memória, mas não sei como lapplypode interferir em uma função constante para um determinado objeto como obj_addr.

Agradeço antecipadamente!

  • 2 respostas
  • 96 Views
Martin Hope
Javier
Asked: 2024-08-22 20:46:50 +0800 CST

O relançamento em multi-catch está formalmente definido? [duplicado]

  • 11
Esta pergunta já tem respostas aqui :
Por que é legal lançar novamente um Throwable em certos casos, sem declará-lo? (3 respostas)
Fechado há 14 horas .

Esta postagem foi editada e enviada para revisão há 13 horas .

Por que é throw epermitido, mas não throw a, no seguinte caso?

  void test() {
    try {
      System.out.println();
    } catch (Error | RuntimeException e) {
      var a = e;
      //throw a; unreported exception Throwable; must be caught or declared to be thrown
      throw e;
    }
  }

Tudo isso intuitivamente faz sentido, mas a partir do JLS 14.20

Uma cláusula multi-catch pode ser considerada uma sequência de cláusulas uni-catch. Ou seja, uma cláusula catch onde o tipo do parâmetro de exceção é denotado como uma união D1|D2|...|Dné equivalente a uma sequência de n cláusulas catch onde os tipos dos parâmetros de exceção são tipos de classe D1, D2, ..., Dnrespectivamente. No bloco de cada uma das n cláusulas catch, o tipo declarado do parâmetro de exceção é lub(D1, D2, ..., Dn).

Como lub(Error,RuntimeException)is Throwable, o código acima deve ser equivalente a:

    try {
      System.out.println();
    } catch (Error e) {
      Throwable lub = e;
      throw lub;
    } catch (RuntimeException e) {
      Throwable lub = e;
      throw lub;
    }

(que obviamente não compila)

Além disso, o tipo de aé o tipo de e"quando tratado como se não aparecesse em um contexto de atribuição" ( JLS 14.4.1 ), mas como mostrado acima não é o mesmo que o tipo de e.

Há algo que eu esqueci?


Editar : esta não é uma duplicata de Por que é legal lançar novamente um Throwable em certos casos, sem declará-lo? porque esta questão é específica para multi-catch (que não é discutida lá) e surge devido a um mal-entendido de um fragmento específico do JLS que aborda multi-catch. As respostas fornecidas nesta pergunta me ajudaram a ligar os pontos :)

java
  • 3 respostas
  • 89 Views
Martin Hope
Gregor Grunz
Asked: 2024-08-12 21:57:52 +0800 CST

Qual é a maneira correta de exportar valores enum para um enum sem nome em módulos C++?

  • 11

Me deparei com as bibliotecas de processamento de imagens de https://github.com/nothings/stb/ e ao experimentar módulos C++, tentei usar stb_image.h "como módulo".

Para isso eu escrevi um pequeno módulo wrapper (mesma técnica demonstrada pelo glm, https://github.com/g-truc/glm que fornece um empacotamento de sua biblioteca como módulo C++ dentro do glm.cppm) e parece funcionar como um encanto:

module;

#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"

export module stb_image;

// this "seems" correct
export using ::stbi_uc;

// this should be correct
export stbi_uc *stbi_load(char const *filename,int *x,int *y,int *comp,int req_comp);
export void stbi_image_free(void *retval_from_stbi_load);

// is this the correct way to export enum values?
export using ::STBI_default;
export using ::STBI_grey;
export using ::STBI_rgb;
export using ::STBI_rgb_alpha;

Não tenho certeza de como lidar com esses valores STBI que são fornecidos em stb_image.h como uma enumeração sem nome:

enum
{
   STBI_default = 0, // only used for desired_channels

   STBI_grey       = 1,
   STBI_grey_alpha = 2,
   STBI_rgb        = 3,
   STBI_rgb_alpha  = 4
};

Experimentei acima e pelo menos o Visual C++ 2022 "aceita" o que criei e o código é executado corretamente, os valores podem ser usados ​​de outro código importando este módulo "stbi_image".

Mas pesquisando na Internet, não consegui encontrar nenhuma descrição de "se houver e como" esses valores enum de um enum sem nome podem ser exportados em um módulo C++.

O que eu fiz foi a maneira correta de fazer isso?

c++
  • 1 respostas
  • 74 Views
Martin Hope
Enigmativity
Asked: 2024-06-04 19:08:45 +0800 CST

Expanda os valores em linhas para distribuir valores

  • 11

Eu tenho uma série de valores no Excel.

A linha superior é um número base. A segunda linha mostra quantos valores em cada número da série. A terceira linha é o valor total desse número na série.

Entrada

Observe que no meu exemplo os números na terceira linha somam 42 (um acaso completo!).

Quero expandir esses números assim:

Saída

O número da série é a base mais a sequência de 1 até o número da segunda linha. Então o valor é o número do valor dividido pelo número na sequência atual.

Observe que a linha final soma o mesmo que a linha de entrada. Estou distribuindo esses números uniformemente.

A verdadeira aplicação aqui é expandir os valores de um orçamento feito mensalmente pela quantidade de dias do mês e distribuir os números por dia. Pretendo então agrupar por semanas.

Estou lutando para fazer com que até mesmo a expansão mais básica funcione:

=HSTACK(BYCOL(R8C3:R8C5,LAMBDA(n,SEQUENCE(n,1))))

Eu adoraria ser apontado na direção certa.

excel
  • 1 respostas
  • 55 Views
Martin Hope
k.st.
Asked: 2024-03-27 18:36:31 +0800 CST

Permitir que std::expected use um construtor privado

  • 11

Tento criar uma classe não copiável e não móvel, cuja construção de objetos só deve ser feita através de uma função create em vez de construtores públicos. A função create retornará um std::expectedobjeto contendo o objeto criado ou um objeto de erro. Para impor a construção por meio da função create, quero tornar privados todos os construtores disponíveis. O objetivo principal desta abordagem é a construção de objetos sem exceções.

Aqui está um exemplo simples:

class Foo
{
    int val_{};

public:
    Foo() = delete;
    Foo(const Foo&) = delete;
    Foo& operator=(const Foo&) = delete;

    static auto
    create(int val) noexcept -> std::expected<Foo, std::error_code>
    {
        if (val == 42)
            return std::unexpected<std::error_code>(std::in_place, EINVAL, std::generic_category() );

        return std::expected<Foo, std::error_code>{ std::in_place, val };
    }

private:

    friend class std::expected<Foo, std::error_code>;

    explicit Foo(int val) noexcept
    : val_{ val }
    {};

};

Observe que fiz std::expected<Foo, std::error_code>um friendpara permitir que ele chame o construtor privado. Mas ainda recebo um erro do compilador. Aqui está o código no Compiler Explorer .

c++
  • 1 respostas
  • 218 Views
Martin Hope
Caduchon
Asked: 2024-03-20 18:46:45 +0800 CST

Entenda o que realmente acontece ao chamar uma função de lançamento em uma função noexcept

  • 11

Veja o código a seguir contendo 3 implementações de uma função que chama outra função de lançamento.

# include <stdexcept>

void f()
{
    throw std::runtime_error("");
}

void g1()
{
    f();
}

void g2() noexcept
{
    f();
}

void g3() noexcept
{
    try{ f(); } catch(...){ std::terminate(); }
}

int main()
{
    return 0;
}

No meu entendimento da noexceptespecificação, g2e g3são estritamente equivalentes. Mas, quando compilo no Compiler Explorer com GCC, o código gerado é estritamente equivalente para g1and g2, mas não para g3:

g1():
        push    rbp
        mov     rbp, rsp
        call    f()
        nop
        pop     rbp
        ret
g2():
        push    rbp
        mov     rbp, rsp
        call    f()
        nop
        pop     rbp
        ret
g3():
        push    rbp
        mov     rbp, rsp
        call    f()
        jmp     .L9
        mov     rdi, rax
        call    __cxa_begin_catch
        call    std::terminate()
.L9:
        pop     rbp
        ret

Por que ?

c++
  • 2 respostas
  • 74 Views
Martin Hope
Milad Ahmadi
Asked: 2023-11-27 19:13:58 +0800 CST

Verificação nula com construtor primário em C# 12

  • 11

Estou usando C# 12. Em C# 12 posso usar o construtor primário:

public class UserService(IUnitOfWork uow) : IUserService
{

}

Antes do C# 12 eu usava verificação nula para itens que injetava no construtor:

public class UserService : IUserService
{
    private readonly IUnitOfWork _uow;

    public UserService(IUnitOfWork uow)
    {
        ArgumentNullException.ThrowIfNull(uow);
        _uow = uow;
    }
}

Agora, como posso fazer a verificação nula em C# 12?
É necessário usar o fail fast com o construtor primário?

c#
  • 1 respostas
  • 79 Views
Martin Hope
Yuri Astrakhan
Asked: 2023-10-15 08:11:00 +0800 CST

Opção idiomática<T> para Option<U> quando T -> U é definido com From

  • 11

Dados dois tipos de tamanho arbitrário Te U, onde U: From<T>, há uma razão pela qual a biblioteca padrão não fornece From<Option<T>> for Option<U>um where U: From<T>? Tentei fazer isso, mas recebi um erro de implementação conflitante, então claramente há uma limitação, mas não tenho certeza de onde. E sim, eu entendo que posso fazer isso com um Option::map(), mas parece que o std deveria fornecer isso imediatamente.

enum Opt<T> {
    Some(T),
    None,
}

impl<T: From<U>, U> From<Opt<T>> for Opt<U> {
    fn from(opt: Opt<T>) -> Self {
        match opt {
            Opt::Some(t) => Opt::Some(t.into()),
            Opt::None => Opt::None,
        }
    }
}

struct A;
struct B;

impl From<A> for B {
    fn from(_: A) -> Self {
        B
    }
}

fn main() {
    let a = Opt::Some(A);
    let _b: Opt<B> = a.into();
}

Erro

error[E0119]: conflicting implementations of trait `From<Opt<_>>` for type `Opt<_>`
 --> src/bin/main.rs:6:1
  |
6 | impl<T: From<U>, U> From<Opt<T>> for Opt<U> {
  | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: conflicting implementation in crate `core`:
          - impl<T> From<T> for T;
rust
  • 1 respostas
  • 113 Views
Martin Hope
jerin
Asked: 2023-10-09 01:20:02 +0800 CST

Por que um ponto e vírgula perdido não é mais detectado pelos compiladores modernos `-pedantes`?

  • 11

O trecho a seguir gera erros de compilação ao adicionar -pedantice -Werrorem compiladores um pouco antigos.

#include <cstdint>
#include <iostream>

int add(int a, int b){
    return a + b;
}; // <-- stray semicolon

int main (){
    return 0;
}

No entanto, isso não acontece nas versões mais recentes do compilador. Encontre uma matriz de gcc(10.x, 11.x) e clang(5.x, 6.x) demonstrando a diferença em https://godbolt.org/z/KWeb8WTxz .

Tenho duas partes na minha pergunta:

  1. Por que isso não é acionado em compiladores recentes?
  2. É possível ativar o comportamento antigo em versões recentes do clangou gcc?
c++
  • 1 respostas
  • 79 Views
Prev
Próximo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

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

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve