CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] unique_ptr et arrays

godrik
godrik
Niveau 30
25 juin 2013 à 00:45:35

Bonjour a vous,

Le code suivant compile :

std::unique_ptr<float []> load_intervals (new float [nbintervals+1]);

Mais le code

std::unique_ptr<float []> load_intervals = new float [nbintervals+1];

genere l'erreur "error: conversion from ‘float*’ to non-scalar type ‘std::unique_ptr<float []>’ requested" dans gcc 4.5.2.

J'ai toujours pense qu'avec un parametre unique au constructueur les deux notations etaient exactement equivalente.

Une idee de ce qui se passe?

Merci a vous

Erik

JusteImbiber
JusteImbiber
Niveau 4
25 juin 2013 à 01:32:35

std::unique_ptr<float []> load_intervals (new float [nbintervals+1]);

est équivalent à

std::unique_ptr<float []> load_intervals = unique_ptr<float[]>(new float [nbintervals+1]);

new float [nbintervals+1] retourne un pointeur et non un objet unique_ptr<float[]> c'est pour ça que tu ne peut pas faire ce genre d'opérations il faut bien garder en tete qu'un pointeur et un objet te servant de pointeur ne sont pas la même chose.

Pseudo supprimé
Pseudo supprimé 25 juin 2013 à 02:45:01

http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.4/a01404.html

ligne 102

explicit unique_ptr(pointer __p)

http://en.cppreference.com/w/cpp/language/explicit

godrik
godrik
Niveau 30
25 juin 2013 à 04:12:21

Justeimbiber, je ne vois pas le rapport. Evidement que pointeur et unique_ptr sont des choses differenfes. Je m'attendais ce que les deux versions du code appele le constructeur de unique_ptr avec un parametre float*. D'ailleurs ce constructeur existe et elite informe qu'il est taggue explicit et que c'est ca qui cause une erreur.
Je pense pas queette equivalence existe parce la deuxieme ecriture implique un appel a un move constructeur ou a un constructuer par copie (ce qui serait tres ineficace)

Je n'avais jamais rencontre ce tag la: explicit. On comprend bien a quoi il sert ici, il empeche qu'un unique_ptr soit construit implicitement, ce qui pourrait induire une segfault (double free ou free sur la pile).
Mais je ne suis pas sur de l'interet de distinguer foo a =b; de foo a(b);. Y a t'il une autre difference que l'utilisation de explicit?

Pseudo supprimé
Pseudo supprimé 25 juin 2013 à 08:03:11

"Y a t'il une autre difference que l'utilisation de explicit?"

foo a = b; // copy initialization
foo a(b); // direct initialization

plus d'infos:

http://www.gotw.ca/gotw/001.htm
http://www.gotw.ca/gotw/036.htm

http://en.cppreference.com/w/cpp/language/copy_initialization
http://en.cppreference.com/w/cpp/language/direct_initialization

godrik
godrik
Niveau 30
25 juin 2013 à 18:22:45

Merci de ces precisions.

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment